前言
本案例只是简单介绍JVM排查工具,调优措施,以及普遍示例简单解析。(更完整命令可以参考:docs.oracle.com/javase/7/do…)
一. 常用工具
- jmap
jmap命令是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。
使用示例:
- jmap -histo $PID –> 显示堆中对象的统计信息
其中instance表示元素出现的个数,bytes表示元素所占内存大小(单位kb)
- jamp -heap $PID –> 显示Java堆详细信息
1 | js复制代码Attaching to process ID 31370, please wait... |
- jmap -dump:live,format=b,file=dumpfile $PID –> 生成堆转储快照dump文件
或jmap -dump:live,format=b,file=heapdump.hprof $PID,hprof方便通过mat解析。live子选项是可选的。如果指定了live子选项,堆中只有活动的对象会被转储。(执行较为耗时)
- jstack
jstack是java虚拟机自带的一种堆栈跟踪工具。常用于分析线程问题(如线程间死锁[deadLock])
使用示例:
- jstack -l $PID > /tmp/dump/jstack.log –> 导出堆栈信息
-l :会打印出额外的锁信息
- 找出java进程中消耗CPU最多的线程TID
- 结合top命令可以查出占用CPU最高的线程: top -H -p pid
详细输出可以使用:ps p {pid}-L -o pcpu,pid,tid,time,tname,cmd
- 将TID转化成十六进制: printf 0x%x n
- 从jstack.log 文件中找出TID对应的16进制数据
- jstat
JVM statistics Monitoring,用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译(即使编译)等运行数据。
- jstat -gc $PID –> 获取垃圾回收等信息
1 | js复制代码 结果分析:(C一般是容量,U结尾一般是使用量) |
1 | js复制代码引言:JVM配置中除了常用的xmx,xms |
- GC结果分析
ygc平均耗时=YGCT/YGC(s)=5176.81/469204=0.011s=11ms
ygc时间间隔=YGC/程序的运行时间
1 | js复制代码如果各项参数设置合理,系统没有超时日志出现,GC频率不高,GC耗时不高,那么没有必要进行GC优化; |
本文转载自: 掘金