JDK內建工具使用總結
阿新 • • 發佈:2022-12-04
目錄
以下使用的是jdk11
jinfo 檢視或修改jvm的引數、屬性
使用示例:
jinfo 23167 # 列印 VM flags and system properties
jinfo -flags 23167 # 列印 VM flags
jinfo -sysprops 23167 # 列印 system properties
jinfo -flag MetaspaceSize 23167 # 列印指定的vm引數值
jinfo -flag [+|-]<name> 23167 # 增加、減少vm引數
jinfo -flag <name>=<value> # 設定vm的值
jstack 檢視執行緒堆疊
檢視執行緒堆疊:jstack -l -e PID
,-l表示顯示鎖資訊,-e表示顯示額外的資訊(allocated、defined_classes)
一般將結果輸出到一個檔案裡,分析檔案
...
- 第一部分是jvm的資訊,堆疊快照的時間、虛擬機器版本模式等資訊
- 第二部分是jvm內部執行緒資訊(SMR為Safe Memory Reclamation安全記憶體分配),這裡的elements與下面的各個堆疊資訊的tid對應,堆疊中的nid與外部作業系統檢視到的執行緒id對應
- 第三部分是執行緒的具體資訊,依次為:
- 執行緒名稱
- 執行緒id,demon表示是守護執行緒
- 執行緒的優先順序
- 作業系統中執行緒的優先順序
- cpu,執行緒獲取到的cpu總時間
- elaspsed,執行緒啟動後經過的時間
- allocated,執行緒分配的位元組數
- defined_classes,本執行緒定義的class個數(要開啟 -XX:+PrintExtendedThreadInfo才會輸出資料)
- tid,執行緒id,與SMR中elements中的值對應
- nid,作業系統中執行緒id,這裡顯示的都是十六進位制的
- 執行緒的狀態,waiting on condition
- 下面就是執行緒具體的堆疊了
- Locked ownable synchronizers:表示執行緒可用的用於同步的排它鎖物件,Ownable Synchronizer是一個同步器,這個同步器的同步屬性是通過使用AbstractOwnableSynchronizer或者它的子類來實現的,如ReentrantLock和ReentrantReadWriteLock中的write-lock
- 第四部分是JVM的執行緒資訊
- 最後一部分是JNI(Java Native Interface)引用的資訊,注意這些引用可能會導致記憶體洩露,因為這些native的引用並不會被自動垃圾回收
排除執行緒cpu過高
可用通過top -p PID -H
查出執行緒高的id,轉換成16進位制,在jstack中根據nid找到該執行緒的堆疊進行分析可能導致cpu過高的程式碼
排除死鎖
分析jstack裡面是否有DeadLock關鍵字
jmap dump堆到檔案
一般在oom時將堆提前dump下來,或開啟oom dump-XX:+HeapDumpOnOutOfMemoryError
,分析哪些物件佔用記憶體jmap -dump:live,format=b,file=./t.bin PID
jhsdb
有很多子選項,增加對應的選項後可以檢視具體命令幫助
檢視jvm堆狀態
jhsdb jmap --heap --pid PID
jstat 檢視gc情況
基本使用方法為:jstat -選項 -h 5 -t PID 重新整理間隔 重新整理次數,如jstat -gcutil -t 8048 1s 5
-h 5表示每5行顯示一次頭部欄,-t表示顯示執行的時間戳
jstat -option 可以檢視可選的所有選項:
-class 檢視類載入統計
- 時間戳
- Loaded,載入的class數量
- Bytes,所佔空間大小
- Unloaded,未載入數量
- Bytes,未載入所佔空間大小
- Time,載入使用的時間
-compiler 檢視編譯統計
- Compiled:編譯數量
- Failed:失敗數量
- Invalid:不可用數量
- Time:時間
- FailedType:失敗型別
- FailedMethod:失敗的方法
-gc 檢視垃圾回收統計
- S0C:第一個倖存區的大小
- S1C:第二個倖存區的大小
- S0U:第一個倖存區的使用大小
- S1U:第二個倖存區的使用大小
- EC:伊甸園區的大小
- EU:伊甸園區的使用大小
- OC:老年代大小
- OU:老年代使用大小
- MC:方法區大小
- MU:方法區使用大小
- CCSC:壓縮類空間大小
- CCSU:壓縮類空間使用大小
- YGC:年輕代垃圾回收次數
- YGCT:年輕代垃圾回收消耗時間
- FGC:老年代垃圾回收次數
- FGCT:老年代垃圾回收消耗時間
- GCT:垃圾回收消耗總時間
-gccapacity 檢視堆記憶體統計
- NGCMN:新生代最小容量
- NGCMX:新生代最大容量
- NGC:當前新生代容量
- S0C:第一個倖存區大小
- S1C:第二個倖存區的大小
- EC:伊甸園區的大小
- OGCMN:老年代最小容量
- OGCMX:老年代最大容量
- OGC:當前老年代大小
- OC:當前老年代大小
- MCMN:最小元資料容量
- MCMX:最大元資料容量
- MC:當前元資料空間大小
- CCSMN:最小壓縮類空間大小
- CCSMX:最大壓縮類空間大小
- CCSC:當前壓縮類空間大小
- YGC:年輕代gc次數
- FGC:老年代GC次數
-gccause 檢視gc原因
jstat -gccause -t 8048 1s 5
元空間記憶體統計,新生代、老年代記憶體及垃圾回收統計
jstat -gcmetacapacity -t 8048 1s 5
jstat -gcnew -t 8048 1s 5
jstat -gcnewcapacity -t 8048 1s 5
jstat -gcold -t 8048 1s 5
jstat -gcoldcapacity -t 8048 1s 5
-gcutil 垃圾回收總結統計
- S0:倖存1區當前使用比例
- S1:倖存2區當前使用比例
- E:伊甸園區使用比例
- O:老年代使用比例
- M:元資料區使用比例
- CCS:壓縮使用比例
- YGC:年輕代垃圾回收次數
- YGCT:年輕代垃圾回收時間,從啟動到當前時間,單位s
- FGC:老年代垃圾回收次數
- FGCT:老年代垃圾回收消耗時間,從啟動到當前時間,單位s
- CGC:壓縮類空間垃圾回收次數
- CGCT:壓縮類空間垃圾回收總時間
- GCT:垃圾回收消耗總時間,從啟動到當前時間,單位s
-printcompilation 檢視jvm編譯方法統計
- Compiled:最近編譯方法的數量
- Size:最近編譯方法的位元組碼數量
- Type:最近編譯方法的編譯型別
- Method:方法名標識
jhat web檢視工具
jvisualvm視覺化工具
總結
- 檢視堆疊:
jstack -l -e PID
- 檢視堆記憶體:
jhsdb jmap --heap --pid PID
- dump堆:
jmap -dump:live,format=b,file=./t.bin PID