常用指令:
這裡主要介紹如下幾個工具:
分析工具可使用MemoryAnalyzer
1、jps:檢視本機java程序資訊
2、jstat:性能監控工具
3、jmap:列印記憶體映射資訊,制作 堆dump檔案
4、jhat:記憶體分析工具,用于解析堆dump檔案并以适合人閱讀的方式展示出來
5、jconsole:簡易的JVM可視化工具(需要開啟jmx)
6、jvisualvm:功能更強大的JVM可視化工具(需要開啟jmx)
7、jstack:列印線程的棧資訊,制作 線程dump檔案
8.新的線上工具有arthas,官方使用文檔
進階使用 — Arthas 3.5.5 文檔
9.jcmd
檢視jcmd幫助:jcmd pid help
學習視訊:
一個小時徹底搞懂垃圾收集器G1&ZGC詳解每秒幾十萬并發JVM如何優化
Java線程Dump分析工具--jstack
jmap
1)jmap -heap pid:輸出堆記憶體設定和使用情況(JDK11使用jhsdb jmap --heap --pid pid)
這個不錯,顯示友好!
2)jmap -histo pid:輸出heap的直方圖,包括類名,對象數量,對象占用大小
這個不錯,可以及時看到類的執行個體個數!!!在full gc dump不出來的時候,用這個可以看下!
3)jmap -histo:live pid:同上,隻輸出存活對象資訊
4)jmap -clstats pid:輸出加載類資訊
5)jmap -help:jmap指令幫助資訊
6)jmap -dump:live,format=b,file=heapdump pid:将記憶體使用的詳細情況輸出到檔案名為heapdump
可使用jhat指令檢視該檔案:jhat -port 4000 檔案名 ,在浏覽器中通路http:localhost:4000/
總結:
該指令适用的場景是程式記憶體不足或者GC頻繁,這時候很可能是記憶體洩漏。通過用以上指令檢視堆使用情況、大量對象被持續引用等情況。
jstat
Java虛拟機統計工具,全稱“Java Virtual Machine statistics monitoring tool”。可以用于監視JVM各種堆和非堆記憶體大小和使用量
可參考:JVM學習之jstat使用方法
幾個好用的選項:-gccapacity -gcutil(注意-gcutil顯示的是百分比)
0)jstat -gccause pid:輸出full gc的原因!!!
1)jstat -class pid:輸出加載類的數量及所占空間資訊。
2)jstat -gc pid:輸出gc資訊,包括gc次數和時間,記憶體使用狀況(可帶時間和顯示條目參數)
jstat -gc PID 3000 20, 3秒一次,20次(機關KB, 下圖是G1)
jstat -gcutil PID 顯示的是百分比
S0C:年輕代第一個survivor的容量(位元組)
S1C:年輕代第二個survivor的容量(位元組)
S0U:年輕代第一個survivor已使用的容量(位元組)
S1U:年輕代第二個survivor已使用的容量(位元組)
EC:年輕代中Eden的空間(位元組)
EU:年代代中Eden已使用的空間(位元組)
OC:老年代的容量(位元組)
OU:老年代中已使用的空間(位元組)
PC:永久代的容量
PU:永久代已使用的容量
YGC:從應用程式啟動到采樣時年輕代中GC的次數
YGCT:從應用程式啟動到采樣時年輕代中GC所使用的時間(機關:S)
FGC:從應用程式啟動到采樣時老年代中GC(FULL GC)的次數
FGCT:從應用程式啟動到采樣時老年代中GC所使用的時間(機關:S)
jinfo
pid,檢視指定pid的所有JVM資訊
1)jinfo -flags pid 查詢虛拟機運作參數資訊。
2)jinfo -flag name pid,查詢具體參數資訊,如jinfo -flag UseSerialGC 42324,檢視是否啟用UseSerialGC
Jconsole
JConsole連接配接遠端伺服器方法
一些參考案例:
一次Spring Boot假死診斷。。。_mifffy_java的部落格-CSDN部落格_springboot 假死
JDK8記FullGC時候Metaspace記憶體不會被垃圾回收(遇到了一次Metaspace設定過小,造成總是full gc而沒有響應的情況!這個案例寫到了)
相關知識:
JVM -- FULL GC觸發條件總結以及解決政策
Shallow Heap 和 Retained Heap的差別