JVM故障運維工具
1 jps 查看進程pid
jps
2 jmap 查看堆內存
1 用來查看內存信息,實例個數以及佔用內存大小
#查看歷史生成的實例
jmap -histo <pid> > ./log.txt
#查看當前存活的實例,執行過程中可能會觸發一次full gc
jmap -histo:live 24452
2 查看堆的內存使用情況
jmap -heap 24452
3 導出dump文件,使用可視化工具(例如jvisualvm)查看dump文件
jmap -dump:format=b,file=jvm.dump 24452
設置jvm參數,在內存溢出時自動輸出dump文件。
# -XX:+PrintGCDetails
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./jvm.dump
3 jstack 查看堆棧信息
1 查看進程中線程狀態與堆棧信息。
使用jvisualvm同樣可以可視化查看線程dump信息。
jstack <pid>
2 配合使用top+jstack定位CUP使用率過高(有個專門的小節)
使用top找到使用率最高的線程。
# jstack 36032 > 1.txt
# cat 1.txt | grep -A 30 8ccc
4 jinfo 查詢運行參數
查看JVM參數
jinfo -flags <pid>
查看java系統參數
jinfo -sysprops 29964
5 jstat 查看堆內存使用情況、gc次數等
查看gc情況
jstat -gc 29964
S0/S1、E、O、M、CCSC分別爲survivor區、Eden、老年代、元數據區、壓縮類空間(單位KB)。
YGC/FGC:YoungGC/FullGC次數
YGCT/FGCT/GCT:YoungGC/FullGC/總GC耗時(單位S)
觀察各區域的變化
jstat -gc pid 1000 10 (每隔1秒執行1次命令,共執行10次)
計算速率
Young GC的平均耗時可以通過 YGCT/YGC 公式算出
Full GC的每次耗時可以用公式 FGCT/FGC 計算得出
在每次gc後eden區使用一般會大幅減少,survivor和老年代都有可能增長,這些增長的對象就是每次Young GC後存活的對象,同時還可以看出每次Young GC後進去老年代大概多少對象,從而可以推算出老年代對象增長速率。
查看jstat所有選項
jstat --help
jstat -options