本文仅列举常用的jvm性能监控和故障处理工具,由本人经验由使用频率从高到底介绍
文章目录
所有举例命令中涉及到的jvm进程id为:9527
一、虚拟机统计信息监视工具-jstat(JVM Statistic Monitoring Tool)
# -h5表示每5行输出一次头信息,9527为进程号,1000为每秒输出一次
# 主要关注已使用空间占此空间的百分比
jstat -gcutil -h5 9527 1000
jstat -gcutil监控结果截图:
其中表头含义依次为:
S0:survivor0使用比例
S1:survivor1使用比例
E :Eden区使用比例
O :老年代使用比例
M :元空间使用比例(P:permanent永久代使用百分比)
CCS:压缩使用比例(Compressed class space)
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回的总时间
FGC:对堆内存整体包含(新生代,老年代,永久代
)垃圾回收次数
FGCT:对堆内存整体包含(新生代,老年代,永久代
)垃圾回收消耗时间
GCT:垃圾回收消耗总时间 所有耗时统计的默认单位为秒
二、java内存映像工具-jmap(Memory Map for java)
jmap不仅可以获取堆转储快照,还可以查询finalize执行队列、java堆和方法区的相信信息,如空间使用率、当前用的是哪种收集器等。
# 查看jvm堆占用情况
jmap -heap 9527
# 根据对象的占用大小排序,输出前n行
jmap -histo 9527 | awk 'NR<100'
jmap -histo 9527 | head -n 100
# dump堆文件,加live参数会触发一次fullgc,只dump可达对象
jmap -dump:live,format=b,file=/home/heap_xxx.bin 9527
在生产环境中,一般会增加jvm配置,当发生内存溢出时候自动转储快照文件,以供事后分析:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap_xxx.bin
三、java堆栈跟踪工具-jstatck(Stack Trace for Java)
jstack [option] vmid
-F 强制输出线程堆栈
-l 除堆栈外,显示关于锁的附加信息
-m 如果涉及本地方法,显示C/C++的堆栈
常用的方式是,查询最消耗CPU的线程
:
# 1.查询需要分析的jvm进程的vmid
top/ps -ef | grep xx
# 2.找出jvm进程中占用cpu最高的线程号
top -Hp 9527
# 3.将线程号转为十六进制
printf "%x" nid
# 4.通过jstatck工具查看该线程状态和堆栈(-A为匹配nid后的30行)
jstack 9527 | grep 16进制nid -A 30
四、java配置信息工具-jinfo(Configuation Info for Java)
实时查看和调整虚拟机各项参数:
# 打印jvm配置
jinfo 9527
# 输出System.getProperties()的内容
jinfo -sysprops 9527
# 输出某个具体的jvm配置(此处为最大堆内存)
jinfo -flag MaxHeapSize 9527
# 查看该jvm每个线程内存分配
jinfo -flag ThreadStackSize 9527
五、虚拟机进程状况工具-jps(JVM Process Status Tool)
这个工具虽然常用但是简单,所以列在靠后
jps
# 输出虚拟机启动时的JVM参数
jps -v | grep xxx
ps -ef | grep xxx
六、jcmd
# 增加参数(无法实时修改,需要增加jvm配置重启生效)
-XX:NativeMemoryTracking=detail
# 用jinfo查看当前jvm配置是否生效
jinfo -flag NativeMemoryTracking 9527
jcmd 9527 VM.native_memory summary scale=MB
# 设置基线
jcmd 9527 VM.native_memory baseline
# 经过一段时间再观察内存变化
jcmd 9527 VM.native_memory summary.diff scale=MB
# 结合内存分配详情
pmap -x 19 | sort -n -k3
# 注意以下命令无法直接修改NMT配置,可以通过下面的版本命令查询结果为manageable可以实时修改,比如GC打印相关的配置
jinfo -flag NativeMemoryTracking=detail 9527
java -XX:+PrintFlagsFinal -version | grep manageable
七、堆栈转储快照分析工具-jhat (JVM Heap Analysis Tool)
# 通过暴漏的端口用浏览器查看分析结果,不推荐使用,生产环境禁止使用,使用eclipse的MAT分析
jhap dump_xxx.bin
总结
jdk原生工具中最常用的就是jstat和jmap以及jstack命令,需要熟练掌握其基础使用方法遇到jvm方面问题可以快速定位问题,其他工具了解即可。