1. 程式人生 > >使用jstat檢視JVM統計資訊

使用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就不能再追加使用其他選項 例如:

  1. 檢視幫助資訊: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.

以上的幫助資訊,其實已經包含了很多介紹,大家可以自行學習一下。

  1. 檢視選項資訊:jstat -options
[[email protected] ~]$ jstat -options
-class
-compiler
-gc
-gccapacity
-gccause
-gcmetacapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcutil
-printcompilation

使用 -options選項,可以列出jstat支援的所有outputOptions(輸出選項)我們平時使用最多的,就是輸出選項中的這些命令。

outputOptions:

輸出選項,如果未指定常規選項,則可以指定輸出選項,由單個的statOption,加上任何的另一個輸出選項(-h或-t) 例如:

[[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: 最近編譯的類名,方法名