1. 程式人生 > 其它 >JDK內建工具使用總結

JDK內建工具使用總結

目錄

以下使用的是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