天天看點

JVM工具相關

常用指令:

這裡主要介紹如下幾個工具:

分析工具可使用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)

JVM工具相關

 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的差別