JVM调优工具详解
2023-07-03 12:26:53 5 举报
JVM调优工具详解
作者其他创作
大纲/内容
<b><font color="#ff0000">Jmap</font></b>
可以用来查看内存信息,实例个数以及占用内存大小
<b><font color="#b71c1c">jmap -histo 进程号 > ./log.txt</font></b>
<b>num:</b>序号
<b>instances:</b>实例数量
<b>bytes:</b>占用空间大小
<b>class name:</b>类名称,[C is a char[],[S is a short[],[I is a int[],[B is a byte[],[[I is a int[][]
<b>查看堆信息</b>
<b><font color="#b71c1c">jmap -heap 进程号</font></b>
<b>堆内存dump文件</b>
<b><font color="#b71c1c">jmap -dump:format=b,file=eureka.hpro 进程号</font></b>
设置内存溢出自动导出dump文件
<b><font color="#b71c1c">-XX:+HeapDumpOnOutOfMemoryError</font></b>
<b><font color="#ff0000">-XX:HeapDumpPath=./ (路径)</font></b>
测试代码配置jvm参数 ‐Xms10M ‐Xmx10M ‐XX:+PrintGCDetails ‐XX:+HeapDumpOnOutOfMemoryError ‐XX:HeapDumpPath=D:\jvm.dump
可以用jvisualvm命令工具导入该dump文件分析
<b><font color="#b71c1c">Jstack</font></b>
用<b>jstack加进程id</b>查找死锁
<b>Thread-1</b>" 线程名<br>
<b>prio=5</b> 优先级=5
<b>tid=0x000000001fa9e000</b> 线程id
<b>nid=0x2d64</b> 线程对应的本地线程标识nid
java.lang.Thread.State: BLOCKED 线程状态
还可以用jvisualvm自动检测死锁
<b>远程连接jvisualvm</b>
java ‐Dcom.sun.management.jmxremote.port=8888 ‐Djava.rmi.server.hostname=192.168.50.60 ‐Dcom.sun.management.jmxremote.ssl=false ‐Dcom.sun.management.jmxremote.authenticate=false ‐jar microservice‐eureka‐server.jar
<b>-Dcom.sun.management.jmxremote.port </b>为远程机器的JMX端口
<b>-Djava.rmi.server.hostname</b> 为远程机器IP
tomcat的JMX配置:在<b>catalina.sh</b>文件里的最后一个JAVA_OPTS的赋值语句下一行增加如下配置行
JAVA_OPTS="$JAVA_OPTS ‐Dcom.sun.management.jmxremote.port=8888 ‐Djava.rmi.server.hostname=192.168.50.60 ‐Dcom.sun.mnagement.jmxremote.ssl=false ‐Dcom.sun.management.jmxremote.authenticate=false"
<b>jstack找出占用cpu最高的线程堆栈信息</b>
使用命令<b><font color="#b71c1c">top -p <pid> </font></b>,显示你的java进程的内存情况,pid是你的<b>java进程号</b>,比如19663
按H,获取每个线程的内存情况
找到内存和cpu占用最高的线程tid,比如19664
转为十六进制得到 0x4cd0,此为线程id的十六进制表示
执行 <b><font color="#b71c1c">jstack 19663|grep -A 10 4cd0</font></b>,得到线程堆栈信息中 4cd0 这个线程所在行的后面10行,从堆栈中可以发现导致cpu飙高的调用方法
<b><font color="#b71c1c">Jinfo</font></b>
查看正在运行的Java应用程序的扩展参数
查看jvm的参数
<b><font color="#b71c1c">jinfo -flags 进程号</font></b>
查看java系统参数
<b><font color="#b71c1c">jinfo -sysprops 进程号</font></b>
<b><font color="#b71c1c">Jstat</font></b>
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量
<b>jstat [-命令选项] [vmid] [间隔时间(毫秒)] [查询次数]</b>
<b><font color="#b71c1c">jstat -gc pid</font></b> 最常用,可以评估程序内存使用及GC压力整体情况
<b><font color="#b71c1c">S0C:</font></b>第一个幸存区的大小,单位KB
<b><font color="#b71c1c">S1C</font></b>:第二个幸存区的大小
<b><font color="#b71c1c">S0U:</font></b>第一个幸存区的使用大小
<b><font color="#b71c1c">S1U</font></b>:第二个幸存区的使用大小
<b><font color="#b71c1c">EC</font></b>:伊甸园区的大小
<b><font color="#b71c1c">EU:</font></b>伊甸园区的使用大小
<b><font color="#b71c1c">OC</font></b>:老年代大小
<b><font color="#b71c1c">OU</font></b>:老年代使用大小
<b><font color="#b71c1c">MC</font></b>:方法区大小(元空间)
<b><font color="#b71c1c">MU</font></b>:方法区使用大小
<b><font color="#b71c1c">CCSC:</font></b>压缩类空间大小
<font color="#b71c1c"><b>CCSU</b>:</font>压缩类空间使用大小
<b><font color="#b71c1c">YGC</font></b>:年轻代垃圾回收次数
<b><font color="#b71c1c">YGCT:</font></b>年轻代垃圾回收消耗时间,单位s
<b><font color="#b71c1c">FGC:</font></b>老年代垃圾回收次数
<b><font color="#b71c1c">FGCT:</font></b>老年代垃圾回收消耗时间,单位s
<b><font color="#b71c1c">GCT:</font></b>垃圾回收消耗总时间,单位s
<b>堆内存统计</b>
<b>NGCMN</b>:新生代最小容量
<b>NGCMX</b>:新生代最大容量
<b>NGC</b>:当前新生代容量
<b>S0C</b>:第一个幸存区大小
<b>S1C</b>:第二个幸存区的大小
<b>EC</b>:伊甸园区的大小
<b>OGCMN</b>:老年代最小容量
<b>OGCMX</b>:老年代最大容量
<b>OGC</b>:当前老年代大小
<b>OC</b>:当前老年代大小<br>
<b>MCMN</b>:最小元数据容量
<b>MCMX</b>:最大元数据容量
<b>MC</b>:当前元数据空间大小
<b>CCSMN</b>:最小压缩类空间大小
<b>CCSMX</b>:最大压缩类空间大小
<b>CCSC</b>:当前压缩类空间大小
<b>YGC</b>:年轻代gc次数
<b>FGC</b>:老年代GC次数
<b>新生代垃圾回收统计</b>
<b>S0C</b>:第一个幸存区的大小
<b>S1C</b>:第二个幸存区的大小
<b>S0U</b>:第一个幸存区的使用大小
<b>S1U</b>:第二个幸存区的使用大小
<b>TT</b>:对象在新生代存活的次数
<b>MTT</b>:对象在新生代存活的最大次数
<b>DSS</b>:期望的幸存区大小
<b>EC</b>:伊甸园区的大小
<b>EU</b>:伊甸园区的使用大小
<b>YGC</b>:年轻代垃圾回收次数
<b>YGCT</b>:年轻代垃圾回收消耗时间
<b>新生代内存统计</b>
<b>NGCMN</b>:新生代最小容量
<b>NGCMX</b>:新生代最大容量
<b>NGC</b>:当前新生代容量
<b>S0CMX</b>:最大幸存1区大小
<b>S0C</b>:当前幸存1区大小
<b>S1CMX</b>:最大幸存2区大小
<b>S1C</b>:当前幸存2区大小
<b>ECMX</b>:最大伊甸园区大小
<b>EC</b>:当前伊甸园区大小
<b>YGC</b>:年轻代垃圾回收次数
<b>FGC</b>:老年代回收次数
<b>老年代垃圾回收统计</b>
<b>MC</b>:方法区大小
<b>OGCMX</b>:老年代最大容量
<b>OGC</b>:当前老年代大小
<b>OC</b>:老年代大小
<b>YGC</b>:年轻代垃圾回收次数
<b>FGC</b>:老年代垃圾回收次数
<b>FGCT</b>:老年代垃圾回收消耗时间
<b>GCT</b>:垃圾回收消耗总时间
<b>元数据空间统计</b>
<b>MCMN</b>:最小元数据容量
<b>MCMX</b>:最大元数据容量
<b>MC</b>:当前元数据空间大小
<b>CCSMN</b>:最小压缩类空间大小
<b>CCSMX</b>:最大压缩类空间大小
<b>CCSC</b>:当前压缩类空间大小
<b>YGC</b>:年轻代垃圾回收次数
<b>FGC</b>:老年代垃圾回收次数
<b>FGCT</b>:老年代垃圾回收消耗时间
<b>GCT</b>:垃圾回收消耗总时间
<b>查看GC统计</b>
<b>S0</b>:幸存1区当前使用比例
<b>S1</b>:幸存2区当前使用比例
<b>E</b>:伊甸园区使用比例
<b>O</b>:老年代使用比例
<b>M</b>:元数据区使用比例
<b>CCS</b>:压缩使用比例
<b>YGC</b>:年轻代垃圾回收次数
<b>FGC</b>:老年代垃圾回收次数
<b>FGCT</b>:老年代垃圾回收消耗时间
<b>GCT</b>:垃圾回收消耗总时间
<b>JVM运行情况预估</b>
用<b><font color="#b71c1c"> jstat gc -pid </font></b>命令可以计算出如下一些关键数据
<b>年轻代对象增长的速率</b>
可以执行命令 jstat -gc pid 1000 10 (每隔1秒执行1次命令,共执行10次),通过观察EU(eden区的使用)来估算每秒eden大概新增多少对象
<b>Young GC的触发频率和每次耗时</b>
<b>每次Young GC后有多少对象存活和进入老年代</b>
<b><font color="#b71c1c">jstat -gc pid 300000 10</font></b> ,观察每次结果eden,survivor和老年代使用的变化情况
Full GC的触发频率和每次耗时
Full GC的每次耗时可以用公式 <b>FGCT/FGC</b> 计算得出。
<b><font color="#b71c1c">优化思路</font></b>
尽量让每次Young GC后的存活对象<b>小于</b>Survivor区域的<b>50%</b>,都留存在年轻代里
尽量别让对象进入老年代。尽量<b><font color="#b71c1c">减少Full GC</font></b>的频率,避免<b>频繁</b>Full GC对JVM性能的影响。
0 条评论
下一页