欢迎您, 来到 宁时修博客.^_^

Java程序线上排查命令----04、jstat

2019/06/19 言则行 Java,linux命令 362
Java程序的问题排查命令

一、jstat的简介

    jstat是JDK自带的一个轻量级小工具,全称“Java Virtual Machine statistics monitoring tool”,它位于$JAVA_HOME/bin目录下,是用于监控虚拟机各种运行状态信息的命令行工具,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,包括了对Heap size和垃圾回收状况的监控。在没有GUI图形的服务器上,它是运行期定位虚拟机性能问题的首选工具。

    官方文档:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html



二、jstat的使用参数

[root@test-web-server ~]# 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.

[root@test-web-server ~]# jstat -options -help
-class
-compiler
-gc
-gccapacity
-gccause
-gcmetacapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcutil
-printcompilation



    参数解释:

    option: 参数选项,一般使用 -gcutil 查看gc情况。

    -t :将时间戳列显示为输出的第一列,时间戳是从目标JVM的启动时间开始计算(单位秒)。

    -h:每n个样本(输出行)显示一个列标题,其中n是一个正整数。默认值为0,它显示第一行数据的列标题。


    vmid:虚拟机标识符,当前运行的java进程号。

                vmid采用以下形式:<lvmid>[@<hostname>[:<port>]]     

                其中<lvmid>是目标Java虚拟机的本地vm标识符,通常是进程ID;

                <hostname>是运行目标Java虚拟机的主机的名称; <port>是目标主机上rmiregistry的端口号。

                有关虚拟机标识符的更完整说明,请参阅jvmstat文档。


    lines:标题行之间的样本数。

    interval:采样间隔。允许使用以下表格:<n>["ms"|"s"]      

                其中<n>是一个整数,后缀指定单位为毫秒(“ms”)或秒(“s”)。

                默认单位为“ms”。


    count:终止前要采取的样本数量。指定输出多少次记录,缺省则会一直打印。


    参数 interval 和 count 代表查询间隔和次数,如果省略这两个参数,说明只查询一次。假设需要每250毫秒查询一次进程5828垃圾收集状况,一共查询5次,那命令行如下:

jstat -gc 5828 250 5

    

    对于命令格式中的 VMID 与 LVMID 需要特别说明下:如果是本地虚拟机进程,VMID (Virtual Machine IDentifier,虚机标识符)和 LVMID(Local Virtual Machine IDentifier,虚机标识符)是一致的,如果是远程虚拟机进程,那VMID的格式应当是:[protocol:][//] lvmid [@hostname[:port]/servername]。


    

    option:选项option代表用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集和运行期编译状况,具体选项及作用如下:

-class:监视类装载、卸载数量、总空间及类装载所耗费的时间。

-gc:监视Java堆状况,包括Eden区、2个Survivor区、老年代、永久代等的容量。
-gccapacity:监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大和最小空间。
-gcutil:监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比。
-gccause:与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因。

-gcmetacapacity:显示metaspace的大小。
-gcnew:监视新生代GC的状况。
-gcnewcapacity:监视内容与-gcnew基本相同,输出主要关注使用到的最大和最小空间。
-gcold:监视老年代GC的状况。
-gcoldcapacity:监视内容与—gcold基本相同,输出主要关注使用到的最大和最小空间。

-compiler:输出JIT编译器编译过的方法、耗时等信息。
-printcompilation:输出已经被JIT编译的方法。



三、示例

   1、 jstat –class<pid>: 显示加载class的数量,及所占空间等信息。

[root@test-web-server ~]# jstat -class 31941
Loaded  Bytes  Unloaded  Bytes     Time   
 20395 36566.5      229   325.9      10.33

    Loaded : 已经装载的类的数量

    Bytes : 装载类所占用的字节数

    Unloaded:已经卸载类的数量

    Bytes:卸载类的字节数

    Time:装载和卸载类所花费的时间



    2、jstat -compiler <pid>:显示VM实时编译的数量等信息。

[root@test-web-server ~]# jstat -compiler 31941
Compiled Failed Invalid   Time   FailedType FailedMethod
   22226      6       0   120.60          1 com/mysql/jdbc/AbandonedConnectionCleanupThread run

    Compiled:编译任务执行数量

    Failed:编译任务执行失败数量

    Invalid :编译任务执行失效数量

    Time :编译任务消耗时间

    FailedType:最后一个编译失败任务的类型

    FailedMethod:最后一个编译失败任务所在的类及方法



    3、jstat -gc <pid>:可以显示垃圾收集堆统计信息,查看gc的次数、时间。

[root@test-web-server ~]# jstat -gc 31941
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
320000.0 320000.0  0.0    0.0   1920000.0 1144186.1 4096000.0   64336.4   116096.0 110047.0 14464.0 13463.1     30    1.003   1      0.394    1.397

    S0C:年轻代中第一个survivor区的容量 (KB)

    S1C:年轻代中第二个survivor区的容量 (KB)

    S0U:年轻代中第一个survivor区目前已使用空间 (KB)

    S1U:年轻代中第二个survivor区目前已使用空间 (KB)

    EC:年轻代中Eden区的容量 (KB)

    EU:年轻代中Eden区目前已使用空间 (KB)

    OC:年老代的容量 (KB)

    OU:年老代目前已使用空间 (KB)  

    MC:metaspace(元数据空间)的容量 (KB)

    MU:metaspace(元数据空间)目前已使用空间 (KB)

    CCSC:压缩类空间容量(KB)

    CCSU:使用的压缩类空间(KB)

    YGC:从应用程序启动到采样时年轻代(Young Generation) gc次数

    YGCT:从应用程序启动到采样时年轻代(Young Generation) gc所用时间(s)

    FGC:从应用程序启动到采样时年老代(Old Generation) gc(full gc)次数

    FGCT:从应用程序启动到采样时年老代(Old Generation) gc(full gc)所用时间(s) 

    GCT:从应用程序启动到采样时gc所用总时间(s)



    4、jstat -gccapacity <pid>:内存池中代(young,old)使用的空间容量。

[root@test-web-server ~]# jstat -gccapacity 31941
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
2560000.0 2560000.0 2560000.0 320000.0 320000.0 1920000.0  4096000.0  4096000.0  4096000.0  4096000.0      0.0 1150976.0 116096.0      0.0 1048576.0  14464.0     30     1

     NGCMN:年轻代(young)初始化(最小)的大小(KB)  

     NGCMX:年轻代(young)的最大容量(KB)

     NGC:年轻代(young)中当前的容量(KB)

     S0C:年轻代中第一个survivor区的容量(KB)

     S1C:年轻代中第二个survivor区的容量(KB)

     EC:年轻代中Eden区的容量(KB)

     OGCMN:年老代(old)初始化(最小)的大小(KB)   

     OGCMX:年老代(old)最大的大小(KB)      

     OGC:年老代(old)当前新生成的容量(KB)        

     OC:年老代(old)当前容量(KB)

     MCMN:metaspace(元空间)中初始化(最小)的大小(KB) 

     MCMX:metaspace(元空间)的最大容量(KB)     

     MC:metaspace(元空间)当前新生成的容量(KB)    

     CCSMN:最小压缩类空间大小(KB)    

     CCSMX:最大压缩类空间大小(KB)     

     CCSC:当前压缩类空间大小(KB)    

     YGC:从应用程序启动到采样时年轻代(Young Generation) gc次数

     FGC:从应用程序启动到采样时年老代(Old Generation) gc(full gc)次数



    5、jstat -gcutil <pid>:统计gc信息

[root@test-web-server ~]# jstat -gcutil 31941
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00   0.00  61.56   1.57  94.79  93.08     30    1.003     1    0.394    1.397

    S0:年轻代中第一个survivor区百分比利用率 

    S1:年轻代中第二个survivor区百分比利用率    

    E:年轻代中Eden区百分比利用率

    O:年老代百分比利用率

    M:metaspace(元数据空间)百分比利用率

    CCS:压缩类空间百分比利用率

    YGC:从应用程序启动到采样时年轻代(Young Generation) gc次数

    YGCT:从应用程序启动到采样时年轻代(Young Generation) gc所用时间(s)

    FGC:从应用程序启动到采样时年老代(Old Generation) gc(full gc)次数

    FGCT:从应用程序启动到采样时年老代(Old Generation) gc(full gc)所用时间(s) 

    GCT:从应用程序启动到采样时gc所用总时间(s)



    6、jstat -gcnew <pid>:年轻代(Young Generation) 对象的信息。

[root@test-web-server ~]# jstat -gcnew 31941
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT  
320000.0 320000.0    0.0    0.0  8   8 160000.0 1920000.0 1215123.9     30    1.003

    S0C:年轻代中第一个survivor区的容量(KB)

    S1C:年轻代中第二个survivor区的容量(KB)  

    S0U:年轻代中第一个survivor区已使用空间(KB)    

    S1U:年轻代中第二个survivor区已使用空间(KB)  

    TT:持有次数限制 

    MTT:最大持有次数限制  

    DSS:期望的survivor大小(KB)    

    EC:年轻代中Eden区容量(KB)       

    EU:年轻代中Eden区已使用空间(KB)     

    YGC:从应用程序启动到采样时年轻代(Young Generation) gc次数

    YGCT:从应用程序启动到采样时年轻代(Young Generation) gc所用时间(s)



    7、jstat -gcnewcapacity<pid>: 年轻代(Young Generation)对象的信息、占用量。

[root@test-web-server ~]# jstat -gcnewcapacity 31941
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC 
 2560000.0  2560000.0  2560000.0 320000.0 320000.0 320000.0 320000.0  1920000.0  1920000.0    30     1

    NGCMN:年轻代(Young Generation)初始化(最小)容量(KB)     

    NGCMX:年轻代(Young Generation)最大容量(KB)

    NGC:年轻代(Young Generation)当前使用的容量(KB)      

    S0CMX:年轻代(Young Generation)中第一个survivor区的最大容量(KB)      

    S0C:年轻代(Young Generation)中第一个survivor区的当前使用容量(KB)     

    S1CMX:年轻代(Young Generation)中第二个survivor区的最大容量(KB)     

    S1C:年轻代(Young Generation)中第二个survivor区的当前使用容量(KB)        

    ECMX:年轻代(Young Generation)中Eden区的最大容量(KB)        

    EC:年轻代中Eden区的当前容量(KB)     

    YGC:从应用程序启动到采样时年轻代(Young Generation) gc次数

    FGC:从应用程序启动到采样时年老代(Old Generation) gc(full gc)次数



    8、jstat -gcold <pid>:年老代(Old Generation)对象和元数据空间的信息。

[root@test-web-server ~]# jstat -gcold 31941
   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT   
116096.0 110047.0  14464.0  13463.1   4096000.0     64336.4     30     1    0.394    1.397

    MC:metaspace(元数据空间)的容量(KB)  

    MU: metaspace(元数据空间)目前已使用容量(KB)       

    CCSC:压缩类空间容量(KB)     

    CCSU:压缩类空间使用容量(KB)       

    OC:年老代(Old Generation)的容量(KB)          

    OU:年老代(Old Generation)的已使用容量(KB)       

    YGC:从应用程序启动到采样时年轻代(Young Generation) gc次数

    FGC:从应用程序启动到采样时年老代(Old Generation) gc(full gc)次数

    FGCT:从应用程序启动到采样时年老代(Old Generation) gc(full gc)所用时间(s) 

    GCT:从应用程序启动到采样时gc所用总时间(s)


    

    9、jstat -gcoldcapacity <pid>: 年老代(Old Generation)对象的信息、占用量。

[root@test-web-server ~]# jstat -gcoldcapacity 31941
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT   
  4096000.0   4096000.0   4096000.0   4096000.0    30     1    0.394    1.397

    OGCMN:年老代(Old Generation) 初始化(最小容量(KB)      

    OGCMX:年老代(Old Generation)最大容量(KB)        

    OGC:年老代(Old Generation)当前新生成的容量(KB)         

    OC:年老代(Old Generation)当前使用的容量(KB)       

    YGC:从应用程序启动到采样时年轻代(Young Generation) gc次数

    FGC:从应用程序启动到采样时年老代(Old Generation) gc(full gc)次数

    FGCT:从应用程序启动到采样时年老代(Old Generation) gc(full gc)所用时间(s) 

    GCT:从应用程序启动到采样时gc所用总时间(s)


    10、jstat -gcmetacapacity <pid>: 元数据空间对象的信息、占用量。

[root@test-web-server ~]# jstat -gcmetacapacity 31941
   MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT     GCT   
       0.0  1150976.0   116096.0        0.0  1048576.0    14464.0    30     1    0.394    1.397

    MCMN:元数据空间(metaspace)初始化容量(KB)      

    MCMX:元数据空间(metaspace)最大容量(KB)         

    MC:元数据空间(metaspace)当前使用容量(KB)       

    CCSMN:压缩类空间最小容量(KB)      

    CCSMX:压缩类空间最大容量(KB)       

    CCSC:压缩类空间当前使用容量(KB)     

    YGC:从应用程序启动到采样时年轻代(Young Generation) gc次数

    FGC:从应用程序启动到采样时年老代(Old Generation) gc(full gc)次数

    FGCT:从应用程序启动到采样时年老代(Old Generation) gc(full gc)所用时间(s) 

    GCT:从应用程序启动到采样时gc所用总时间(s)


    11、jstat -printcompilation <pid>:当前VM执行的信息。

[root@test-web-server ~]# jstat -printcompilation 31941
Compiled  Size  Type Method
   22229   1424    1 com/sun/jmx/mbeanserver/Repository retrieveNamedObject

    Compiled :编译任务的数目

    Size :方法生成的字节码的大小

    Type:编译类型

    Method:类名和方法名用来标识编译的方法。类名使用 / 做为一个命名空间分隔符。方法名是给定类中的方法。上述格式是由-XX:+PrintComplation选项进行设置的


    12、jstat -gccause <pid>:显示垃圾回收的相关信息(通-gcutil),同时显示上次和当前垃圾回收的原因。

    

[root@test-web-server ~]# jstat -gccause 31941
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC                 
  0.00   1.27   4.24   1.57  94.79  93.08     31    1.015     1    0.394    1.409 Allocation Failure   No GC

    LGCC:上次GC的原因

    GCC:当前GC原因(No GC 为当前没有执行GC)


四、附加

    -gcutil选项:vmid 31941以250毫秒间隔获取7个样本,并显示 -gcutil选项指定的输出。

[root@test-web-server ~]# jstat -gcutil 31941 250 7
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00  97.02  70.31  66.80  95.52  89.14      7    0.300     0    0.000    0.300
  0.00  97.02  86.23  66.80  95.52  89.14      7    0.300     0    0.000    0.300
  0.00  97.02  96.53  66.80  95.52  89.14      7    0.300     0    0.000    0.300
 91.03   0.00   1.98  68.19  95.89  91.24      8    0.378     0    0.000    0.378
 91.03   0.00  15.82  68.19  95.89  91.24      8    0.378     0    0.000    0.378
 91.03   0.00  17.80  68.19  95.89  91.24      8    0.378     0    0.000    0.378
 91.03   0.00  17.80  68.19  95.89  91.24      8    0.378     0    0.000    0.378

    这个例子的输出表明在第三个和第四个样本之间发生了年轻代GC。GC耗时0.078秒,将对象从Eden空间(E)提升到Old空间(O),Old空间利用率从66.80%提高到68.19%。收集之前,survivor空间利用率为97.02%,但收集之后, survivor空间利用率为91.03%。



    重复列标题字符串:vmid 31941以250毫秒的间隔采样,并按-gcnew选项指定显示输出。此外,它使用 -h3 选项在每3行数据后输出列标题。

[root@test-web-server ~]# jstat -gcnew -h3 31941 250
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
  64.0   64.0    0.0   31.7 31  31   32.0    512.0    178.6    249    0.203
  64.0   64.0    0.0   31.7 31  31   32.0    512.0    355.5    249    0.203
  64.0   64.0   35.4    0.0  2  31   32.0    512.0     21.9    250    0.204
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
  64.0   64.0   35.4    0.0  2  31   32.0    512.0    245.9    250    0.204
  64.0   64.0   35.4    0.0  2  31   32.0    512.0    421.1    250    0.204
  64.0   64.0    0.0   19.0 31  31   32.0    512.0     84.4    251    0.204
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
  64.0   64.0    0.0   19.0 31  31   32.0    512.0    306.7    251    0.204

    除了显示重复的标题字符串,这个示例还显示在第二个和第三个样本之间,发生了一个年轻代GC。其持续时间为0.001秒。收集到足够的活动数据,survivor空间从 0利用率(S0U)将超过所需的survivor大小(DSS)。结果,对象被提升到old代(在这个输出中不可见),晋升阈值(TT)从 31 降低到2。

    在第五个和第六个样本之间进行了另一次采集。这个收集发现了很少有survivor,并将晋升阈值恢复到31。


    为每个样本添加时间戳:vmid 31941以250毫秒的间隔采集3个样本。-t 选项用于为第一列中的每个样本生成时间戳。

[root@test-web-server ~]# jstat -gcoldcapacity -t 31941 250 3
Timestamp      OGCMN    OGCMX     OGC       OC       YGC   FGC    FGCT    GCT
          150.1   1408.0  60544.0  11696.0  11696.0   194    80    2.874   3.799
          150.4   1408.0  60544.0  13820.0  13820.0   194    81    2.938   3.863
          150.7   1408.0  60544.0  13820.0  13820.0   194    81    2.938   3.863

    Timestamp(时间戳)列报告自目标JVM启动以来经过的时间(秒)。此外,-gcoldcapacity输出显示年老代新生成容量(OGC)和年老代当前使用容量(OC)随着堆的扩展而增加,以满足分配或提升需求。在第81次Full GC(FGC)之后,年老代新生成容量(OGC)已从11,696 kb 增长到13,820 kb。年老代(Old Generation)最大容量为60,544 kb(OGCMX),因此仍有扩展空间。

点赞
说说你的看法

所有评论: (0)

# 加入组织

1、用手机QQ扫左侧二维码

2、搜Q群:1058582137

3、点击 宁时修博客交流群