天天看點

JDK14性能管理工具:jstat使用介紹

目錄

  • ​​簡介​​
  • ​​JStat指令​​
  • ​​JStat Output Options​​
  • ​​class​​
  • ​​compiler​​
  • ​​gc​​
  • ​​gccapacity​​
  • ​​gcnew​​
  • ​​gcnewcapacity​​
  • ​​gcold​​
  • ​​gcoldcapacity​​
  • ​​gcmetacapacity​​
  • ​​gcutil​​
  • ​​gccause​​
  • ​​printcompilation​​
  • ​​總結​​

簡介

作為一個程式員,經常會為如何定位java程式的問題或者去調優JVM性能而苦惱不已。也許你聽過一些java的profile的強力工具,比如jprofile。但是這些工具大部分都是要收費的,對于我們個人程式員來說十分不友好。

其實JDK已經自帶了很多優秀的性能調優工具,你可以在JAVA_HOME/bin中找到他們。

今天我們的系列文章要介紹的是這四個工具:

  1. Jstat(sun.tools.jstat) 它的全稱是Java Virtual Machine Statistics Monitoring Tool,是用來監控JVM狀态的工具。
  2. jstack(sun.tools.jstack) 它的全稱是Java Stack Trace,是用來做java棧的跟蹤工具。
  3. jmap(sun.tools.jmap) 它的全稱是Java Memory Map,是java的記憶體管理工具。
  4. jhat (com.sun.tools.hat.Main) 它的全稱是Java Heap Analyse Tool,是java的堆分析工具。

有了這四個工具,基本上JVM運作期間的方方面面都可以被覆寫到了。下面我們将具體對每一個工具進行詳細講解。本文将會首先講解Jstat的具體使用。

JStat指令

jstat主要對JVM運作期間的各種參數進行收集,包括檢視類的加載情況,jc中新生代老年代中繼資料空間的使用情況等。

先看下Jstat的指令:

jstat outputOptions [-t] [-h lines] vmid [interval [count]]      
  • outputOptions - 選擇需要輸出哪些内容
  • t - 在第一列輸出timestamp,是從目标JVM啟動時候開始算起
  • h - 選擇每隔n行輸出列的名字,預設是0,表示隻在第一行輸出列的名字
  • vmid - JVM的pid,可以使用jps來檢視
  • interval - jstat輸出的時間間隔預設機關是毫秒
  • count - 表示需要展示多少取樣資料,預設是無限制的,表示會一直取樣輸出,直到JVM停止

JStat Output Options

上面我們講了JStat指令的基本格式,在本節我們會詳細講解JStat的輸出選項。

使用jstat -options可以看到jstat支援的幾個options選項:

jstat -options
-class
-compiler
-gc
-gccapacity
-gccause
-gcmetacapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcutil
-printcompilation      

class

輸出class loader的統計資訊,我們舉個例子:

jstat -class -t 53528 100 5
Timestamp       Loaded  Bytes  Unloaded  Bytes     Time
        19822.8   5214 10752.5        0     0.0       2.91
        19823.0   5214 10752.5        0     0.0       2.91
        19823.0   5214 10752.5        0     0.0       2.91
        19823.2   5214 10752.5        0     0.0       2.91
        19823.2   5214 10752.5        0     0.0       2.91      

上面的例子中53528是目标JVM的pid,100表示取樣的間隔時間是100ms,5表示最後隻展示5條資料。

上面的Timestamp表示的JVM的啟動的時間。

  • Loaded - 有多少個class被加載
  • Bytes - 被加載的class大小
  • Unloaded - 多少class被反加載
  • Bytes - 反加載的class大小
  • Time - 加載和反加載class花費的時間

compiler

compiler統計的是Java HotSpot VM Just-in-Time JIT即時編譯器的資訊。

JIT即時編譯器是為了提升代碼的執行速度而産生的。JVM對于一些熱點代碼,比如多次循環和經常使用的方法。對于這些熱點代碼,JIT會将其編譯成機器代碼,進而提升執行速度。

還是舉剛剛的JVM的例子:

jstat -compiler 53528 100 5
Compiled Failed Invalid   Time   FailedType FailedMethod
    2675      0       0     5.35          0
    2675      0       0     5.35          0
    2675      0       0     5.35          0
    2675      0       0     5.35          0
    2675      0       0     5.35          0      
  • Compiled - 執行的編譯任務的次數
  • Failed - 編譯任務失敗次數
  • Invalid - 置位無效的編譯任務次數
  • Time - 執行編譯任務花費的時間
  • FailedType - 上一次失敗編譯的編譯類型
  • FailedMethod - 上一次編譯失敗的方法名

gc

gc統計的是gc heap資訊

jstat -gc 53528 100 5
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT
 0.0   4096.0  0.0   3978.2 56320.0  33792.0   15360.0    15215.0   21552.0 20680.9 2688.0 2468.0      4    0.025   0      0.000   2      0.003    0.028
 0.0   4096.0  0.0   3978.2 56320.0  33792.0   15360.0    15215.0   21552.0 20680.9 2688.0 2468.0      4    0.025   0      0.000   2      0.003    0.028
 0.0   4096.0  0.0   3978.2 56320.0  33792.0   15360.0    15215.0   21552.0 20680.9 2688.0 2468.0      4    0.025   0      0.000   2      0.003    0.028
 0.0   4096.0  0.0   3978.2 56320.0  33792.0   15360.0    15215.0   21552.0 20680.9 2688.0 2468.0      4    0.025   0      0.000   2      0.003    0.028
 0.0   4096.0  0.0   3978.2 56320.0  33792.0   15360.0    15215.0   21552.0 20680.9 2688.0 2468.0      4    0.025   0      0.000   2      0.003    0.028      

gc的輸出參數比較多,我們一一進行解釋,這樣大家對于gc的運作核心會有更多的了解:

  • S0C - survivor 0區域的容量,以KB為機關
  • S1C - survivor 1區域的容量,以KB為機關

Young Gen被劃分為1個Eden Space和2個Suvivor Space。當對象剛剛被建立的時候,是放在Eden space。垃圾回收的時候,會掃描Eden Space和一個Suvivor Space。如果在垃圾回收的時候發現Eden Space中的對象仍然有效,則會将其複制到另外一個Suvivor Space。

就這樣不斷的掃描,最後經過多次掃描發現任然有效的對象會被放入Old Gen表示其生命周期比較長,可以減少垃圾回收時間。

  • S0U - survivor 0區域的使用大小,以KB為機關
  • S1U - survivor 1區域的使用大小,以KB為機關
  • EC - Eden區域的容量,以KB為機關
  • EU - Eden區域的使用,以KB為機關
  • OC - old區域的容量,以KB為機關
  • OU - old區域的使用,以KB為機關
  • MC - Metaspace中繼資料區的 Committed Size,以KB為機關
  • MU - Metaspace中繼資料區的使用大小,以KB為機關
在JDK8之前,類定義、位元組碼和常量等很少會變更的資訊是放在持久代Perm Gen中的。不過在JDK8之後,Perm Gen已經被取消了,現在叫做Metaspace。Metaspace并不在java虛拟機中,它使用的是本地記憶體。Metaspace可以通過-XX:MaxMetaspaceSize來控制。
  • CCSC - Compressed class的Committed Size,以KB為機關
  • CCSU - Compressed class的使用大小,以KB為機關
Compressed Class Space,它是和-XX:+UseCompressedOops,-XX:+UseCompressedClassesPointers有關的。實際上是一個指針的壓縮,可以使用32bits來表示之前64bits的指針。
  • YGC - young generation的GC次數
  • YGCT - young generation的GC時間
  • FGC - full GC的次數
  • FGCT - full GC的時間
  • GCT - 總的GC時間

gccapacity

gccapacity統計的是記憶體池的建立和大小等統計資訊

jstat -gccapacity 53528 100 5
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC   CGC
     0.0 716800.0  60416.0    0.0 4096.0  56320.0        0.0   716800.0    15360.0    15360.0      0.0 1069056.0  21552.0      0.0 1048576.0   2688.0      4     0     2
     0.0 716800.0  60416.0    0.0 4096.0  56320.0        0.0   716800.0    15360.0    15360.0      0.0 1069056.0  21552.0      0.0 1048576.0   2688.0      4     0     2
     0.0 716800.0  60416.0    0.0 4096.0  56320.0        0.0   716800.0    15360.0    15360.0      0.0 1069056.0  21552.0      0.0 1048576.0   2688.0      4     0     2
     0.0 716800.0  60416.0    0.0 4096.0  56320.0        0.0   716800.0    15360.0    15360.0      0.0 1069056.0  21552.0      0.0 1048576.0   2688.0      4     0     2
     0.0 716800.0  60416.0    0.0 4096.0  56320.0        0.0   716800.0    15360.0    15360.0      0.0 1069056.0  21552.0      0.0 1048576.0   2688.0      4     0     2      
  • NGCMN - 最小的新生代的大小
  • NGCMX - 最大的新生代大小
  • NGC - 目前新生代的大小
  • S0C - survivor 0區域的容量
  • S1C - survivor 1區域的容量
  • EC - Eden區域的容量
  • OGCMN - 最小old代大小
  • OGCMX - 最大old代大小
  • OGC - 目前old代大小
  • OC - 目前old space大小
  • MCMN - 最小metaspace大小
  • MCMX - 最大metaspace大小
  • MC - Metaspace中繼資料區的 Committed Size
  • CCSMN - Compressed class空間的最小容量
  • CCSMX - Compressed class空間的最大容量
  • CCSC - Compressed class的Committed Size
  • YGC - young generation的GC次數
  • FGC - full GC的次數

gcnew

gcnew表示新生代的統計資訊

jstat -gcnew 53528 100 5
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
   0.0 4096.0    0.0 3978.2 15  15 5120.0  56320.0  33792.0      4    0.025
   0.0 4096.0    0.0 3978.2 15  15 5120.0  56320.0  33792.0      4    0.025
   0.0 4096.0    0.0 3978.2 15  15 5120.0  56320.0  33792.0      4    0.025
   0.0 4096.0    0.0 3978.2 15  15 5120.0  56320.0  33792.0      4    0.025
   0.0 4096.0    0.0 3978.2 15  15 5120.0  56320.0  33792.0      4    0.025      
  • S0C - survivor 0區域的容量
  • S1C - survivor 1區域的容量
  • S0U - survivor 0區域的使用大小,以KB為機關
  • S1U - survivor 1區域的使用大小,以KB為機關
  • TT - Tenuring threshold(進入老年代的門檻值?)
  • MTT - 最大的Tenuring threshold
  • DSS - 所需的survivor size
  • EC - Eden區域的容量
  • EU - Eden區域的使用,以KB為機關
  • YGC - 新生代GC次數
  • YGCT - 新生代GC所需的時間

gcnewcapacity

gcnewcapacity統計的是新生代的名額,和gccapacity的結果是很類似的:

jstat -gcnewcapacity 53528 100 5
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC   CGC
       0.0   716800.0    60416.0      0.0      0.0 716800.0   4096.0   716800.0    56320.0     4     0     2
       0.0   716800.0    60416.0      0.0      0.0 716800.0   4096.0   716800.0    56320.0     4     0     2
       0.0   716800.0    60416.0      0.0      0.0 716800.0   4096.0   716800.0    56320.0     4     0     2
       0.0   716800.0    60416.0      0.0      0.0 716800.0   4096.0   716800.0    56320.0     4     0     2
       0.0   716800.0    60416.0      0.0      0.0 716800.0   4096.0   716800.0    56320.0     4     0     2      
  • NGCMN - 最小的新生代的大小
  • NGCMX - 最大的新生代大小
  • NGC - 目前新生代的大小
  • S0CMX - survivor 0區域容量的最大值
  • S0C - survivor 0區域的容量
  • S1CMX - survivor 1區域容量的最大值
  • S1C - survivor 1區域的容量
  • EC - Eden區域的容量
  • ECMX - Eden區域容量的最大值
  • YGC - young generation的GC次數
  • FGC - full GC的次數

gcold

gcold統計old代的資訊

jstat -gcold 53528 100 5
   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT    CGC    CGCT     GCT
 21552.0  20680.9   2688.0   2468.0     15360.0     15215.0      4     0    0.000     2    0.003    0.028
 21552.0  20680.9   2688.0   2468.0     15360.0     15215.0      4     0    0.000     2    0.003    0.028
 21552.0  20680.9   2688.0   2468.0     15360.0     15215.0      4     0    0.000     2    0.003    0.028
 21552.0  20680.9   2688.0   2468.0     15360.0     15215.0      4     0    0.000     2    0.003    0.028
 21552.0  20680.9   2688.0   2468.0     15360.0     15215.0      4     0    0.000     2    0.003    0.028      

結果的幾項名額前面已經介紹過了,這裡就不再重複了

gcoldcapacity

gcoldcapacity表示old代的容量資訊

jstat -gcoldcapacity 53528 100 5
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT    CGC    CGCT     GCT
        0.0    716800.0     15360.0     15360.0     4     0    0.000     2    0.003    0.028
        0.0    716800.0     15360.0     15360.0     4     0    0.000     2    0.003    0.028
        0.0    716800.0     15360.0     15360.0     4     0    0.000     2    0.003    0.028
        0.0    716800.0     15360.0     15360.0     4     0    0.000     2    0.003    0.028
        0.0    716800.0     15360.0     15360.0     4     0    0.000     2    0.003    0.028      

gcmetacapacity

gcmetacapacity統計的是中繼資料區域的容量資訊

jstat -gcmetacapacity 53528 100 5
   MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT    CGC    CGCT     GCT
       0.0  1069056.0    21552.0        0.0  1048576.0     2688.0     4     0    0.000     2    0.003    0.028
       0.0  1069056.0    21552.0        0.0  1048576.0     2688.0     4     0    0.000     2    0.003    0.028
       0.0  1069056.0    21552.0        0.0  1048576.0     2688.0     4     0    0.000     2    0.003    0.028
       0.0  1069056.0    21552.0        0.0  1048576.0     2688.0     4     0    0.000     2    0.003    0.028
       0.0  1069056.0    21552.0        0.0  1048576.0     2688.0     4     0    0.000     2    0.003    0.028      

gcutil

gcutil統計的是GC總體的情況

jstat -gcutil 53528 100 5
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT
  0.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.028
  0.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.028
  0.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.028
  0.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.028
  0.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.028      
  • S0 - S0區域的使用比例
  • S1 - S1區域的使用比例
  • E - Eden區域的使用比例
  • O - Old區域的使用比例
  • M - 中繼資料區域的使用比例
  • CCS - Compressed class空間的使用比例

gccause

gccause和gcutil非常相識,隻不過多了下面兩列:

  • LGCC - 上次GC的原因
  • GCC - 目前GC的原因
jstat -gccause 53528 100 5
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT    LGCC                 GCC
  0.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.028 Metadata GC Threshold No GC
  0.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.028 Metadata GC Threshold No GC
  0.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.028 Metadata GC Threshold No GC
  0.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.028 Metadata GC Threshold No GC
  0.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.028 Metadata GC Threshold No GC      

printcompilation

printcompilation是JVM編譯器的方法統計

jstat -printcompilation 53528 100 5
Compiled  Size  Type Method
    2675     23    1 jdk/internal/misc/InnocuousThread eraseThreadLocals
    2675     23    1 jdk/internal/misc/InnocuousThread eraseThreadLocals
    2675     23    1 jdk/internal/misc/InnocuousThread eraseThreadLocals
    2675     23    1 jdk/internal/misc/InnocuousThread eraseThreadLocals
    2675     23    1 jdk/internal/misc/InnocuousThread eraseThreadLocals      
  • Compiled - 最近執行的編譯任務次數
  • Size - 最近編譯方法的大小
  • Type - 最新編譯方法的類型
  • Method - 最新編譯方法的名字

總結

本文介紹了JDK14中自帶的jstat JVM分析工具,希望大家能夠在實際的工作中用到。

本文作者:flydean程式那些事