使用jstat檢視JVM統計資訊
溫馨提示:本篇內容基於Java 8編寫,使用不同版本可能存在部分輸出內容不符。
jstat是一個用於監視虛擬機器各種執行狀態資訊的命令列工具。可以檢視本地或者遠端虛擬機器中的類裝載、記憶體、垃圾收集、JIT編譯等執行資料。在 日常工作中,可以幫我我們去觀察JVM記憶體的分配情況、使用率、GC的次數以及耗時,為今後的效能調優提供基礎分析資料。
語法:jstat [ generalOption | outputOptions vmid [ interval [s | ms] [ count ]] 例如:
jstat -help|-options jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
語法說明
generalOption: 常規選項,例如-help、-options選項,如果指定一個常規選項,則無法指定任何其他選項或引數。也就是說jstat後面如果使用了-help 或者-options就不能再追加使用其他選項 例如:
- 檢視幫助資訊:jstat -help
[[email protected] ~]$ jstat -help Usage: jstat -help|-options jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] Definitions: <option> An option reported by the -options option <vmid> Virtual Machine Identifier. A vmid takes the following form: <lvmid>[@<hostname>[:<port>]] Where <lvmid> is the local vm identifier for the target Java virtual machine, typically a process id; <hostname> is the name of the host running the target Java virtual machine; and <port> is the port number for the rmiregistry on the target host. See the jvmstat documentation for a more complete description of the Virtual Machine Identifier. <lines> Number of samples between header lines. <interval> Sampling interval. The following forms are allowed: <n>["ms"|"s"] Where <n> is an integer and the suffix specifies the units as milliseconds("ms") or seconds("s"). The default units are "ms". <count> Number of samples to take before terminating. -J<flag> Pass <flag> directly to the runtime system.
以上的幫助資訊,其實已經包含了很多介紹,大家可以自行學習一下。
- 檢視選項資訊:jstat -options
[[email protected] ~]$ jstat -options
-class
-compiler
-gc
-gccapacity
-gccause
-gcmetacapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcutil
-printcompilation
使用 -options選項,可以列出jstat支援的所有outputOptions(輸出選項)我們平時使用最多的,就是輸出選項中的這些命令。
outputOptions:
[[email protected] ~]$ jstat -gc -t 22979
Timestamp S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
2744532.5 52416.0 52416.0 0.0 0.0 419392.0 272913.5 64.0 64.0 786432.0 52243.1 619 263.428 714286 251783.764 252047.192
可以看到,在命令中使用了-t引數,它在第一列列印了時間戳。
vmid: 如果是本機的虛擬機器程序,它就是程序號,如果是遠端虛擬機器格式為: [protocol:][//]lvmid[@hostname[:port]/servername] 這種方式並不推薦常用,所以僅需瞭解即可。後續會更新使用方式。
interval和count: interval代表查詢間隔,count代表查詢次數,若省略這兩個引數,表示只查詢一次。 例如:
[[email protected] ~]$ jstat -gcnew 22979 1000 5
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
52416.0 52416.0 0.0 0.0 1 6 26208.0 419392.0 275960.4 619 263.428
52416.0 52416.0 0.0 0.0 1 6 26208.0 419392.0 275960.4 619 263.428
52416.0 52416.0 0.0 0.0 1 6 26208.0 419392.0 275960.4 619 263.428
52416.0 52416.0 0.0 0.0 1 6 26208.0 419392.0 275960.5 619 263.428
52416.0 52416.0 0.0 0.0 1 6 26208.0 419392.0 275960.5 619 263.428
這個命令表示每隔一秒(1000毫秒)列印一次新生代的GC情況,一共列印5次
jstat主要選項
使用jstat -options可以列出所有的選項: -class:顯示類載入的統計資訊 -compiler:顯示有關Java HotSpot VM實時編譯器(JIT)行為的統計資訊 -gc:顯示各個記憶體區域容量和GC資訊 -gccapacity:顯示堆的容量的詳細資訊 -gccause:顯示有關垃圾收集統計資訊(和-gcutil功能一樣),但是會輸出上一次GC產生的原因 -gcmetacapacity:顯示有關元空間大小的統計資訊 -gcnew:顯示新生代GC資訊 -gcnewcapacity:顯示新生代的容量資訊和GC資訊 -gcold:顯示老年代和元空間GC資訊 -gcoldcapacity:和-gcold功能基本一致,但是會輸出相應空間大小的統計資訊 -gcutil:顯示有關垃圾回收統計資訊,展示的是百分比的資料 -printcompilation:顯示Java HotSpot VM編譯統計資訊
-class 示例:
[[email protected] ~]$ jstat -class 30934
Loaded Bytes Unloaded Bytes Time
13383 24329.7 0 0.0 9.10
Loaded:載入的類的數量 Bytes:載入的位元組數 Unloaded:解除安裝的類的數量 Bytes:解除安裝的位元組數 Time:執行類載入和解除安裝操作所花費的時間 這個示例展示了程序號為30934的程式它的類裝載情況,根據結果可以看出,它一共載入了13383個類(Loaded)、一共24329.7kb(Bytes)、解除安裝了0個類(Unloaded)、解除安裝類的總大小為0kb(Bytes)以及執行類的載入和解除安裝一共花費了9.1秒(Time)
-compiler 示例:
[[email protected] ~]$ jstat -compiler 30934
Compiled Failed Invalid Time FailedType FailedMethod
18224 2 0 120.79 1 com/mysql/jdbc/AbandonedConnectionCleanupThread run
列名含義: Compiled:執行的編譯任務數 Failed:編譯任務失敗的數量 Invalid:已失效的編譯任務數 Time:執行編譯任務所花費的時間 FailedType:編譯上次失敗的編譯的型別 FailedMethod:上次失敗編譯的類名和方法
-gc 示例:
程序資訊: [[email protected] ~]$ jps -v 30934 jar -Xms512M -Xmx512M 通過jps工具,我們可以看到程序30934啟動時JVM的引數,設定JVM最大可用記憶體為512M,初始記憶體為512M。有了這個前置條件,我們來分析這個程序GC的相關資訊。
[[email protected] ~]$ jstat -gc 30934
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
1024.0 1024.0 544.0 0.0 172544.0 88232.1 349696.0 81249.4 76632.0 74629.2 9088.0 8627.8 452 3.323 3 0.521 3.844
列名含義: S0C:當前survivor space 0總容量(kB) S1C:當前survivor space 1總容量(kB) S0U:survivor space 0已使用容量(kB) S1U:survivor space 1已使用容量(kB) EC:當前eden space總容量(kB) EU:eden space已使用容量(kB) OC:當前old space總容量(kB) OU:old space的已使用容量(kB) MC:Metaspace 總容量(kB) MU:Metacspace已使用容量(kB) CCSC:壓縮類空間總容量(kB) CCSU:已使用的壓縮類空間容量(kB) YGC:Young generation GC次數 YGCT:Young generation GC總耗時 FGC:Full GC次數 FGCT:Full GC總耗時 GCT:GC總耗時
在-gc之後顯示的資料中,包含各種簡寫,上面的列表也列出了他們各自的含義,現在來驗證一下總容量,總容量=survivor + Eden + old space 在輸出結果中得知:
S0 = 1024
S1 = 1024
Eden = 172544
old space = 349696
totalCapacity = (1024 + 1024 + 172544 + 349696)/ 1024
結果:
512M
由計算結果可以得知,上述概念是正確的。從輸出結果來看,我們可以瞭解到這個JVM程序的一些記憶體使用狀況,其次,可以看到不同區域的垃圾回收次數以及垃圾回收的總耗時。
-gccapacity 示例:
[[email protected] ~]$ jstat -gccapacity 30934
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
174592.0 174592.0 174592.0 1024.0 1024.0 172544.0 349696.0 349696.0 349696.0 349696.0 0.0 1116160.0 76632.0 0.0 1048576.0 9088.0 453 3
-gccapacity主要用於體現java堆各個區域使用到的最大、最小空間,單位kb 列名含義: NGCMN:new generation使用到的最小容量 NGCMX:new generation使用到的最大容量 NGC:new generation當前的容量 S0C:survivor0當前的容量 S1C:survivor1當前的容量 EC:Eden當前的容量 OGCMN:old generation使用到的最小容量 OGCMX:old generation使用到的最大容量 OGC:old generation當前的容量 OC:old space當前容量 MCMN:metaspace 使用到的最小容量 MCMX:metaspace 使用到的最大容量 MC:metaspace 空間容量 CCSMN:壓縮類空間最小容量 CCSMX:壓縮類空間最大容量 CCSC:壓縮類空間容量 YGC:Young GC次數 FGC:Full GC次數
-gccause 示例:
[[email protected] ~]$ jstat -gccause 30934 2000
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
0.00 53.12 80.17 23.23 97.39 94.94 453 3.331 3 0.521 3.852 Allocation Failure No GC
列名含義: LGCC:上次發生GC的原因 GCC:本次發生GC的原因 它和-gcutil顯示內容一樣,但是多了上次GC發生的原因和本次GC發生的原因,由結果可以看出,上次是因為無法分配空間,來了一次GC。
-gcutil 示例:
[[email protected] ~]$ jstat -gcutil 30934
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 53.12 94.21 23.23 97.39 94.94 453 3.331 3 0.521 3.852
列名含義: S0:survivor0空間使用率 S1:survivor1空間使用率 E:Eden空間使用率 O:old generation空間使用率 M:metaspace空間使用率 CCS:壓縮類空間使用率 YGC:Young generation GC次數 YGCT:Young generaton GC 耗時 FGC:Full GC 次數 FGCT:Full GC 耗時 GCT:所有GC總耗時 這裡所說的使用率,是指JVM分配給S0 、S1、Eden等空間的記憶體使用率,是相對於S0、S1、Eden等它自身容量來計算的,我們可以結合前面學習到的-gc來查詢他們各自的總容量,和使用量,然後來驗證一下它資料的準確性。 使用-gc檢視總容量和使用量:
[[email protected] ~]$ jstat -gc 30934
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
1024.0 1024.0 0.0 544.0 172544.0 161813.9 349696.0 81249.4 76632.0 74629.2 9088.0 8627.8 453 3.331 3 0.521 3.852
現以Survivor空間使用量來驗證一下,由-gc得知Survivor0總容量為1024,已使用0,所以在-gcutil之後顯示的使用率為0,Survivor1的總容量為1024,已使用544,那麼使用率是544/1024 = 53.12%符合-gcutil所統計的資料。
-gcmetacapacity 示例
[[email protected] ~]$ jstat -gcmetacapacity 30934 2000 5
MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC FGCT GCT
0.0 1116160.0 76632.0 0.0 1048576.0 9088.0 462 3 0.521 3.913
列名含義: MCMN: Metaspace 最小容量 MCMX: Metaspace 最大容量 MC: Metaspace 容量 CCSMN: 壓縮類空間最小容量. CCSMX: 壓縮類空間最大容量 YGC: Young generation GC 次數 FGC: Full GC 次數 FGCT: Full GC 耗時 GCT: GC總耗時
-gcnew 示例:
[[email protected] ~]$ jstat -gcnew 30934
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
1024.0 1024.0 512.0 0.0 15 15 1024.0 172544.0 145247.1 462 3.392
列名含義: S0C: Survivor space 0 總容量 S1C: Survivor space 1 總容量 S0U: Survivor space 0 已使用容量 S1U: Survivor space 1 已使用容量 TT: 晉升閾值(實際上是指物件的年齡,最大15,表示它會被放入Old generation了) MTT: 最大晉升閾值(最大15) DSS: 期望Survivor大小 EC: Eden space 總容量 EU: Eden space 已使用容量 YGC: Young generation GC 次數 YGCT: Young generation GC 耗時
-gcnewcapacity 示例:
[[email protected] ~]$ jstat -gcnewcapacity 30934
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC
174592.0 174592.0 174592.0 57856.0 1024.0 57856.0 1024.0 173568.0 172544.0 462 3
列名含義: NGCMN: New generation 最小容量 NGCMX: New generation 最大容量 NGC: New generation 當前容量 S0CMX: Survivor space 0 最大容量 S0C: Survivor space 0 當前容量 S1CMX: Survivor space 1 最大容量 S1C: Survivor space 1 當前容量 ECMX: Eden space 最大容量 EC: Eden space 當前容量 YGC: Young generation GC 次數 FGC: Full GC 次數
提示: 在Java8中New generation = Survivor0 + Survivor1 + Eden
-gcold 示例:
[[email protected] ~]$ jstat -gcold 30934
MC MU CCSC CCSU OC OU YGC FGC FGCT GCT
76632.0 74629.6 9088.0 8627.8 349696.0 81305.4 463 3 0.521 3.920
列名含義: MC: Metaspace 容量 MU: Metaspace 已使用容量 CCSC: Compressed class space 容量 CCSU: Compressed class space 已使用容量 OC: Old space 容量 OU: Old space 已使用容量 YGC: Young generation GC 次數 FGC: Full GC 次數 FGCT: Full GC 耗時 GCT: 所有GC總耗時
-gcoldcapacity 示例:
[[email protected] ~]$ jstat -gcoldcapacity 30934
OGCMN OGCMX OGC OC YGC FGC FGCT GCT
349696.0 349696.0 349696.0 349696.0 463 3 0.521 3.920
列名含義: OGCMN: Old generation 最小容量 OGCMX: Old generation 最大容量 OGC: Old generation 當前容量 OC: Old space 當前容量 YGC: Young generation GC 次數 FGC: Full GC 次數 FGCT: Full GC 耗時 GCT: 所有GC總耗時
-printcompilation 示例:
[[email protected] ~]$ jstat -printcompilation 30934
Compiled Size Type Method
18226 48 1 sun/nio/ch/SocketOptionRegistry$RegistryKey equals
列名含義: Compiled: 最近編譯任務執行的次數 Size: 最近編譯的位元組數 Type: 最近編譯的型別 Method: 最近編譯的類名,方法名