JVM调优(一)——JVM调优诊断工具详解

        最近项目要生产上线,正在做压测性能测试,开始进行一些性能瓶颈分析,记得上一次做性能分析优化,还是国网项目,针对Kafka,Canal,ES,服务,数据库等一系列的排查分析,后面打算补一下总结内容,感兴趣的可以看我后期的总结。本次先总结一下最基础的相关命令及详解

        常用到的命令主要有jstack、jstat、jmap、jinfo等

1、jinfo命令

        jinfo全称Configuration Info for Java,是用来查看虚拟机配置参数信息,也可用于调整虚拟机的配置参数。在很多情况下,Java应用程序不会指定所有的Java虚拟机参数。开发人员可能不知道某一个具体的Java虚拟机参数的默认值。通过 jinfo工具,开发人员可以很方便地找到Java虚拟机参数的当前值。

        jinfo不仅可以查看运行时某一个Java虚拟机参数的实际取值, 甚至可以在运行时修改部分参数,并使之立即生效。并不是所有参数都支持动态修改。参数只有被标记 manageable的flag可以被实时修改。这个修改能力是极其有限的。

        下面简单介绍一下常用命令:

 1)  jinfo flags <PID>

 jinfo flags <PID>

可以看到不主动配置JVM参数时,系统默认的一些配置信息,然后我们指定配置后查看

 -Xms512m  -Xmx1024m

 jinfo –flags <PID>

 2)  jinfo -sysprops <PID>

jinfo -sysprops <PID>

查看java系统参数 

2、jmap命令 

        jmap能够打印给定Java进程、核心文件或远程DEBUG服务器的共享对象内存映射或堆内存的详细信息。如果给定的进程运行在64位虚拟机上,则必须指定 -J-d64选项,例如jmap -J-d64 -heap pid。

        参数说明

        <no option>

当不使用选项时,jmap打印共享对象映射。

对于加载到目标JVM中的每个共享对象,将打印其开始地址、映射大小和共享对象文件的完整路径。如图:

1)  -dump

-dump:[live],format=b,file=<filename>.hprof  <PID> 

将Java堆以hprof二进制格式转储到filename文件中。live是可选参数,如果指定,则只转储堆中的活动对象。

可以使用jhat (Java Heap Analysis Tool)工具来读取分析生产dump文件。启动jhat服务器 

 

 访问显示如图:

 Jhat分析内容,下次有机会再说明,先往下走

2)  -finalizerinfo <PID>

jmap -finalizerinfo <PID>

 打印等待结束的对象的信息。

3)  -heap <PID>

 jmap -heap <PID>

 打印堆摘要

这个命令相对用的较多,具体说明记录一下

使用的gc垃圾收集器

一、Heap Configuration(堆的配置)

Heap Configuration(堆的配置)
MinHeapFreeRatio

空闲堆空间的最小百分比,值的区间为0到100,默认值为 40。

计算公式为:HeapFreeRatio =(CurrentFreeHeapSize / CurrentTotalHeapSize) * 100。

如果当前HeapFreeRatio < MinHeapFreeRatio,则需要进行堆扩容,扩容的时机应该在每次垃圾回收之后。

MaxHeapFreeRatio

空闲堆空间的最大百分比,值的区间为0到100,默认值为 70。

计算公式为:HeapFreeRatio =(CurrentFreeHeapSize / CurrentTotalHeapSize) * 100。

如果HeapFreeRatio > MaxHeapFreeRatio,则需要进行堆缩容,缩容的时机应该在每次垃圾回收之后。

MaxHeapSize堆空间允许的最大值。
NewSize新生代堆空间的默认值。
MaxNewSize新生代堆空间允许的最大值。
OldSize老年代堆空间的默认值。
NewRatio新生代(2个Survivor区和Eden区 )与老年代(不包括永久区)的堆空间比值。
SurvivorRatio两个Survivor区和Eden区的堆空间比值,默认是8,表示 S0 : S1 :Eden = 1:1:8。
MetaspaceSize元空间的默认值
CompressedClassSpaceSize压缩类空间大小
MaxMetaspaceSize元空间允许的最大值
G1HeapRegionSize在使用 G1 垃圾回收算法时,JVM会将Heap空间分隔为若干个Region,该参数用来指定每个 Region 空间的大小

 

  1. 二、Heap Usage(堆的使用情况)
  2. Heap Usage(堆的使用情况)
    PS Young Generation (Eden + 1 Survivor Space)新生代的使用情况
    Eden Space

    Eden区的使用情况

    From SpaceFrom Survivor区的使用情况
    To Spaceto Survivor区的使用情况
    PS Old Generation老年代的使用情况

    说明:

    capacity表示该区域的总容量

    used表示已使用的容量

    free表示该区域还剩余容量

    used表示该区域的使用比例

4)  -histo[:live] <PID> 

jmap -histo <PID> 

打印堆的直方图。对于每个Java类,将打印对象数量、内存大小(以字节为单位)和完全限定类名。VM内部类名以'*'前缀打印,即打印出来的类名前带*的是VM的内部类。如果指定了live子选项,则只统计活动对象。可以输出到文件中打开。

 

num:序号

instances:实例数量

bytes:占用空间大小

class name:类名称,[C is a char[],[S is a short[],[I is a int[],[B is a byte[],[[I is a int[][] 

5)  -clstats <PID>

jmap -clstats <PID>

打印类加载器的统计信息。对于每个类加载器,它的名称、活动状态、地址、父加载器以及已加载的类的数量和大小都将被打印出来。也会打印出internned string的数量和大小。

 6)  -F

    如果pid没有响应,则使用jmap -dump 或 jmap -histo命令。遇到过不能open file的时候,可以通过加-F,强制输出。

7)  -help or -h

 打印jmap命令的帮助信息。

8)  -J<flag>

将<flag>传递给运行jmap的Java虚拟机

3、jstack命令

        该命令比较常用,用来检测死锁,CPU高等

        用jstack查找死锁

   1)  查找死锁

    jstack -l <PID>

说明:

"Thread-5" 线程名

prio=5 优先级=5

tid= 0x00007fcae8185000线程id

nid= 0xbf8线程对应的本地线程标识nid

runnable 线程状态

可以看到是哪里出现了死锁,所在的类及其行数

2)  远程连接jvisualvm

启动普通的jar程序JMX端口配置:

-Dcom.sun.management.jmxremote

-Dcom.sun.management.jmxremote.port=8899

-Dcom.sun.management.jmxremote.ssl=false

-Dcom.sun.management.jmxremote.authenticate=false 

tomcat的JMX配置

JAVA_OPTS=-Dcom.sun.management.jmxremote.port=8899

-Dcom.sun.management.jmxremote.ssl=false

-Dcom.sun.management.jmxremote.authenticate=false 

jvisualvm远程连接服务需要在远程服务器上配置host(连接ip 主机名),并且要关闭防火墙

 

3)  输出文件分析

  jstack –l <PID> > jatack.log

  printf "%x\n" <tid>

 根据PID输出快照线程,找到CPU最高的线程,10进制转16进制,找对应的线程 状态分析代码

如:

grep "dca" jstack.log -A 20

4、jstat命令 

     jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:

jstat [-命令选项] [vmid] [间隔时间(毫秒)] [查询次数]

   1)  垃圾回收统计

 jstat -gc <pid> 

 最常用,可以评估程序内存使用及GC压力整体情况

更多的是使用,多久打印一次,共打印多少次

jstat -gc <pid>  <interval>  <count>

S0C:第一个幸存区的大小

S1C:第二个幸存区的大小

S0U:第一个幸存区的使用大小

S1U:第二个幸存区的使用大小

EC:伊甸园区的大小

EU:伊甸园区的使用大小

OC:老年代大小

OU:老年代使用大小

MC:方法区大小(元空间)

MU:方法区使用大小

CCSC:压缩类空间大小

CCSU:压缩类空间使用大小

YGC:年轻代垃圾回收次数

YGCT:年轻代垃圾回收消耗时间,单位s

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收消耗时间,单位s

GCT:垃圾回收消耗总时间,单位s 

2)  堆内存统计 

jstat -gccapacity <PID>

 

NGCMN:新生代最小容量

NGCMX:新生代最大容量

NGC:当前新生代容量

S0C:第一个幸存区大小

S1C:第二个幸存区的大小

EC:伊甸园区的大小

OGCMN:老年代最小容量

OGCMX:老年代最大容量

OGC:当前老年代大小

OC:当前老年代大小

MCMN:最小元数据容量

MCMX:最大元数据容量

MC:当前元数据空间大小

CCSMN:最小压缩类空间大小

CCSMX:最大压缩类空间大小

CCSC:当前压缩类空间大小

YGC:年轻代gc次数

FGC:老年代GC次数

 

 3)  新生代垃圾回收统计

jstat -gcnew <PID>

 

S0C:第一个幸存区的大小

S1C:第二个幸存区的大小

S0U:第一个幸存区的使用大小

S1U:第二个幸存区的使用大小

TT:对象在新生代存活的次数

MTT:对象在新生代存活的最大次数

DSS:期望的幸存区大小

EC:伊甸园区的大小

EU:伊甸园区的使用大小

YGC:年轻代垃圾回收次数

YGCT:年轻代垃圾回收消耗时间 

4)  新生代内存统计 

jstat -gcnewcapacity <PID>

 

NGCMN:新生代最小容量

NGCMX:新生代最大容量

NGC:当前新生代容量

S0CMX:最大幸存1区大小

S0C:当前幸存1区大小

S1CMX:最大幸存2区大小

S1C:当前幸存2区大小

ECMX:最大伊甸园区大小

EC:当前伊甸园区大小

YGC:年轻代垃圾回收次数

FGC:老年代回收次数 

5)  老年代垃圾回收统计 

jstat -gcold <PID>

 

MC:方法区大小

MU:方法区使用大小

CCSC:压缩类空间大小

CCSU:压缩类空间使用大小

OC:老年代大小

OU:老年代使用大小

YGC:年轻代垃圾回收次数

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收消耗时间

GCT:垃圾回收消耗总时间

6)  老年代内存统计

jstat -gcoldcapacity <PID>

 

OGCMN:老年代最小容量

OGCMX:老年代最大容量

OGC:当前老年代大小

OC:老年代大小

YGC:年轻代垃圾回收次数

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收消耗时间

GCT:垃圾回收消耗总时间 

7)  元数据空间统计

jstat -gcmetacapacity <PID> 

MCMN:最小元数据容量

MCMX:最大元数据容量

MC:当前元数据空间大小

CCSMN:最小压缩类空间大小

CCSMX:最大压缩类空间大小

CCSC:当前压缩类空间大小

YGC:年轻代垃圾回收次数

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收消耗时间

GCT:垃圾回收消耗总时间

 

8)  占比查看

jstat -gcutil <PID> 

 

S0:幸存1区当前使用比例

S1:幸存2区当前使用比例

E:伊甸园区使用比例

O:老年代使用比例

M:元数据区使用比例

CCS:压缩使用比例

YGC:年轻代垃圾回收次数

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收消耗时间

GCT:垃圾回收消耗总时间

ok,基本上常用的和不常用的都简单记录了下,也不是时时刻刻都在做性能优化,在需要的时候能有个对照就OK了 ,下一个就是针对具体的问题进行查找跟踪分析了,如果不借助工具的情况下,可以通过上述这些命令组合进行分析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/38230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安全和加密常识(6)Base64编码方式

文章目录 什么是 Base64编码原理编解码示例应用什么是 Base64 Base64 是一种用于将二进制数据编码为仅包含64种ASCII字符的文本格式的编码方法,注意,它不是加密算法。它设计的目的主要是使二进制数据能够通过只支持文本的传输层(如电子邮件)进行传输。Base64常用于在需要处…

Windows系统下文件夹权限详解

文章目录 问题描述文件夹属性 问题描述 今天在Win10系统下&#xff0c;实现文件夹设置权限&#xff0c;具体的方案的涉及到我们公司内部的一款加密软件&#xff0c;不太方便透漏&#xff0c;借此机会&#xff0c;我也重新的回顾下windows系统下的文件夹权限 文件夹属性 打开…

vue3+Ts封装axios网络请求

1.安装axios npm i axios 在package.json中检查axios是否安装成功 "dependencies": {"axios": "^1.7.2","vue": "^3.4.29","vue-router": "^4.4.0"}, 2.新建文件 新建文件utils/request.ts import…

js 接收回调函数 转换为promise

下面是一个示例代码&#xff0c;展示如何编写一个接收回调函数并将其转换为 Promise 的 JavaScript 函数&#xff1a; // 定义一个接收回调函数并转换为 Promise 的函数 function convertCallbackToPromise(callbackFunction) {// 返回一个新的 Promise 对象return new Promis…

Java 并发编程常见问题

1、线程状态它们之间是如何扭转的&#xff1f; 1、谈谈对于多线程的理解&#xff1f; 1、对于多核CPU&#xff0c;多线程可以提升CPU的利用率&#xff1b; 2、对于多IO操作的程序&#xff0c;多线程可以提升系统的整体性能及吞吐量&#xff1b; 3、使用多线程在一些场景下可…

鸿蒙开发设备管理:【@ohos.multimodalInput.inputDevice (输入设备)】

输入设备 输入设备管理模块&#xff0c;用于监听输入设备连接、断开和变化&#xff0c;并查看输入设备相关信息。比如监听鼠标插拔&#xff0c;并获取鼠标的id、name和指针移动速度等信息。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&…

【算法专题--栈】用队列实现栈 -- 高频面试题(图文详解,小白一看就懂!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐两个队列实现栈 &#x1f95d;解题思路 &#x1f34d;案例图解 ⭐用一个队列实现栈 &#x1f347;解题思路 &#x1f34d;案例图解 四、总结与提炼 五、共勉 一、前言 用队列实现栈 这道题&#xff0c;可以说是--栈…

WAF 相关的术语解释

QPS 每秒查询率&#xff08;Query Per Second QPS&#xff09; 是对一个特定的查询服务器&#xff0c;在规定时间内所处理流量多少的衡量标准&#xff0c;在因特网上&#xff0c;作为域名系统服务器的机器性能经常用每秒查询率来衡量&#xff0c;对应 fetches/sec&#xff08;…

论文写作笔记9 word论文排版常见问题

1.公式编写 word公式编写麻烦, 我推荐latex编写转word或识图. 识图可以使用软件Mathpix Snipping Tool, latex转word见下方链接. word中输入的Latex代码&#xff0c;按 Alt 将所选字母变成公式&#xff0c; 然后按 Ctrl 将 Latex 代码转换成 Word 公式 MAML在线互转 …

002-基于Sklearn的机器学习入门:回归分析(上)

本节及后续章节将介绍机器学习中的几种经典回归算法&#xff0c;所选方法都在Sklearn库中聚类模块有具体实现。本节为上篇&#xff0c;将介绍基础的线性回归方法&#xff0c;包括线性回归、逻辑回归、多项式回归和岭回归等。 2.1 回归分析概述 回归&#xff08;Regression&…

【深度学习】Speech2Action: Cross-modal Supervision for Action Recognition

文章目录 Speech2Action: 基于跨模态监督的动作识别摘要1. 引言2. 相关工作将剧本与电影对齐动作识别的监督 3. Speech2Action模型3.1 IMSDb 数据集剧本解析动词挖掘舞台指令基于BERT的语音分类器实现细节结果 4. 动作识别视频挖掘4.1 未标注的数据4.2 获取弱标签4.2.1 使用Spe…

《昇思25天学习打卡营第14天 | 昇思MindSpore基于MindNLP+MusicGen生成自己的个性化音乐》

14天 本节学了基于MindNLPMusicGen生成自己的个性化音乐。 MusicGen是来自Meta AI的Jade Copet等人提出的基于单个语言模型的音乐生成模型&#xff0c;能够根据文本描述或音频提示生成高质量的音乐样本。 MusicGen模型基于Transformer结构&#xff0c;可以分解为三个不同的阶段…

springboot笔记示例六:fastjson2集成

springboot笔记示例六&#xff1a;fastjson2集成 本文md下载 https://download.csdn.net/download/a254939392/89491102本文md文档下载地址 #springboot json官方说明 https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-json.htmlsprin…

HP UX服务器监控指标解读(Snmp)

随着企业信息化建设的不断深入&#xff0c;服务器的稳定运行成为了保障业务连续性的关键。HP UX作为一款高性能的Unix服务器操作系统&#xff0c;在各类企业级应用中发挥着重要作用。为了确保HP UX服务器的稳定运行&#xff0c;对其进行全面而细致的监控至关重要。本文将针对监…

⭐ UI自动化工具轻松实现微信消息提醒 ⚡

&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f; 演示效果 &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f; &#x1f605;&#x1f605;&#x1f605;&#x1f605;&#x1f605;&#x1f605; Python安装…

2023HW部分笔试题

题目来源&#xff1a;卡码网 136. 字符串处理器 问题描述 时间限制&#xff1a;1.000S 空间限制&#xff1a;256MB 题目描述 产品代码需要设计一个带游标的字符串处理器&#xff0c;它需要实现以下功能: 插入&#xff1a;在游标所在处添加文本&#xff0c;其对应操作为 i…

AI时代,你的工作会被AI替代吗?

AI在不同领域的应用和发展速度是不同的。在智商方面&#xff0c;尤其是在逻辑推理、数据分析和模式识别等领域&#xff0c;AI已经取得了显著的进展。例如&#xff0c;在国际象棋、围棋等策略游戏中&#xff0c;AI已经能够击败顶尖的人类选手。在科学研究、医学诊断、股市分析等…

一分钟彻底掌握Java枚举

在Java编程语言中&#xff0c;枚举&#xff08;Enum&#xff09;是一种特殊的类&#xff0c;它包含了一组固定的常量。枚举常用于表示固定数量的常量值&#xff0c;例如一周的七天、四个基本方向&#xff08;东、南、西、北&#xff09;等。 0.浅显理解 枚举就像是一个特殊的…

STM32 SWD烧写

最小电路 stm32f103x 内部已经集成了振荡电路&#xff0c;可以省略&#xff1b;rst引脚电路&#xff0c;可以省略&#xff0c;boot0,boot1不需要设置 正常烧录 -------------------------------------------------------------------STM32CubeProgrammer v2.9.0 …

使用 go-control-plane 自定义服务网格控制面

写在前面 阅读本文需要最起码了解envoy相关的概念 本文只是一个类似于demo的测试&#xff0c;只为了学习istio&#xff0c;更好的理解istio中的控制面和数据面&#xff08;pilot -> proxy&#xff09;是如何交互的&#xff0c;下图的蓝色虚线 先说go-control-plane是什么…