美文网首页JVM调优
JVM工具命令之jstat小结

JVM工具命令之jstat小结

作者: LittleMagic | 来源:发表于2020-06-18 22:52 被阅读0次

    jstat

    今日六一八,事情多的很,正好适合写流水账总结。之前已经分别讲过了JVM提供的jstack、jmap工具的用法,今天简单说说jstat吧。

    jstat命令的格式如下。

    # 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.
    

    stat一词顾名思义是“统计”,也就是说jstat命令是打印JVM进程里某些统计信息的。通过jstat -options可以列出所有可用的统计项。

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

    下面逐个列举其用法。

    类加载统计:-class

    # jstat -class 32968
    Loaded  Bytes  Unloaded  Bytes     Time   
     12734 25041.9        0     0.0       5.24
    
    • Loaded:已加载的类的数量
    • Bytes:已加载的类占用的字节数
    • Unloaded:已卸载的类的数量
    • Bytes:已卸载的类占用的字节数
    • Time:加载/卸载类所消耗的时间(秒)

    HotSpot JIT编译统计:-compiler

    # jstat -compiler 32968
    Compiled Failed Invalid   Time   FailedType FailedMethod
       18324      3       0    52.58          1 java/net/URLClassLoader$1 run
    
    • Compiled:编译执行数量
    • Failed:失败的编译执行数量
    • Invalid:失效的编译执行数量
    • Time:编译消耗的时间(秒)
    • FailedType:最近一次编译失败的类型
    • FailedMethod:最近一次编译失败的类及方法

    HotSpot编译方法统计:-printcompilation

    # jstat -printcompilation 32968
    Compiled  Size  Type Method
       18360     12    1 org/apache/flink/shaded/netty4/io/netty/buffer/WrappedByteBuf readBytes
    
    • Compiled:编译执行数量
    • Size:最近一次编译生成的字节码大小(字节)
    • Type:最近一次编译的类型
    • Method:最近一次编译的类及方法

    堆和GC概况统计:-gc

    以下用上了jstat的周期性打印参数,即每隔1000毫秒打印一次,共打印10条,并每隔5行输出一次表头(-h参数)。

    # jstat -gc -h 5 32968 1000 10 
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
    43456.0 43456.0  0.0   2397.5 347904.0 176826.0  869760.0   117548.3  79836.0 77869.0 9840.0 9420.1   1009    4.212   6      0.051    4.263
    43456.0 43456.0  0.0   2397.5 347904.0 181654.1  869760.0   117548.3  79836.0 77869.0 9840.0 9420.1   1009    4.212   6      0.051    4.263
    43456.0 43456.0  0.0   2397.5 347904.0 187518.6  869760.0   117548.3  79836.0 77869.0 9840.0 9420.1   1009    4.212   6      0.051    4.263
    43456.0 43456.0  0.0   2397.5 347904.0 188852.0  869760.0   117548.3  79836.0 77869.0 9840.0 9420.1   1009    4.212   6      0.051    4.263
    43456.0 43456.0  0.0   2397.5 347904.0 194509.4  869760.0   117548.3  79836.0 77869.0 9840.0 9420.1   1009    4.212   6      0.051    4.263
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
    43456.0 43456.0  0.0   2397.5 347904.0 199233.7  869760.0   117548.3  79836.0 77869.0 9840.0 9420.1   1009    4.212   6      0.051    4.263
    43456.0 43456.0  0.0   2397.5 347904.0 201916.8  869760.0   117548.3  79836.0 77869.0 9840.0 9420.1   1009    4.212   6      0.051    4.263
    43456.0 43456.0  0.0   2397.5 347904.0 206240.1  869760.0   117548.3  79836.0 77869.0 9840.0 9420.1   1009    4.212   6      0.051    4.263
    43456.0 43456.0  0.0   2397.5 347904.0 211307.5  869760.0   117548.3  79836.0 77869.0 9840.0 9420.1   1009    4.212   6      0.051    4.263
    43456.0 43456.0  0.0   2397.5 347904.0 216620.3  869760.0   117548.3  79836.0 77869.0 9840.0 9420.1   1009    4.212   6      0.051    4.263
    
    • S0C/S0U:新生代S0区当前容量和占用容量(单位kB,下同)
    • S1C/S1U:新生代S1区当前容量和占用容量
    • EC/EU:新生代Eden区当前容量和占用容量
    • OC/OU:老生代当前容量和占用容量
    • MC/MU:元空间当前容量和占用容量
    • YGC/YGCT:从JVM启动起的Young GC总次数和耗时(单位秒,下同)
    • FGC/FGCT:从JVM启动起的Full GC总次数和耗时
    • GCT:从JVM启动起的GC总耗时

    放个图复习一下基础知识吧。

    JDK 8+已不存在永久代,自动把图中永久代脑补成元空间即可,懒得重新画= =

    堆分代容量统计:-gccapacity

    # jstat -gccapacity 32968
     NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
    434816.0 434816.0 434816.0 43456.0 43456.0 347904.0   869760.0   869760.0   869760.0   869760.0      0.0 1120256.0  79836.0      0.0 1048576.0   9840.0   1016     6
    
    • S0C/S1C/EC/OC/MC/YGC/FGC的含义与上一节相同
    • NGCMN/NGCMX:新生代的最小和最大容量
    • OGCMN/OGCMX:老生代的最小和最大容量
    • OGC:老生代的当前容量
    • MCMN/MCMX:元空间的最小和最大容量
    • CCSMN/CCSMX:压缩类空间的最小和最大容量(压缩类空间与JVM的CompressedOops特性和压缩类指针有关,之后再提)
    • CCSC:当前压缩类空间的大小

    堆分代GC和容量详情:-gcnew(capacity)/-gcold(capacity)/-gcmetacapacity

    分别用来查看新生代、老生代和元空间的详细数据。它们呈现的数据与上面-gc/-gccapacity选项有很多相同,以下仅用-gcnew(capacity)来举例。

    # jstat -gcnew 32968
     S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT  
    43456.0 43456.0    0.0 2633.4  6   6 21728.0 347904.0 104542.9   1041    4.338
    
    # jstat -gcnewcapacity 32968
      NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC 
      434816.0   434816.0   434816.0  43456.0  43456.0  43456.0  43456.0   347904.0   347904.0  1041     6
    

    以下三个需要特别注意:

    • TT:对象在新生代中的存活次数(即所谓tenuring threshold)
    • MTT:对象在新生代中的最大存活次数
    • DSS:当前所需要的Survivor区的容量(当Eden区满时会需要)

    GC汇总信息:-gcutil

    (前面说了辣么多,这个选项其实才是最常用的_(:з」∠)_

    # jstat -gcutil -h 5 32968 1000 10
      S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
      6.20   0.00  39.06  13.81  97.54  95.73   1050    4.373     6    0.051    4.424
      6.20   0.00  39.42  13.81  97.54  95.73   1050    4.373     6    0.051    4.424
      6.20   0.00  40.86  13.81  97.54  95.73   1050    4.373     6    0.051    4.424
      6.20   0.00  41.16  13.81  97.54  95.73   1050    4.373     6    0.051    4.424
      6.20   0.00  42.72  13.81  97.54  95.73   1050    4.373     6    0.051    4.424
      S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
      6.20   0.00  43.17  13.81  97.54  95.73   1050    4.373     6    0.051    4.424
      6.20   0.00  48.45  13.81  97.54  95.73   1050    4.373     6    0.051    4.424
      6.20   0.00  49.80  13.81  97.54  95.73   1050    4.373     6    0.051    4.424
      6.20   0.00  51.23  13.81  97.54  95.73   1050    4.373     6    0.051    4.424
      6.20   0.00  52.54  13.81  97.54  95.73   1050    4.373     6    0.051    4.424
    
    • S0/S1:新生代S0和S1区的占用百分比(即S0U÷S0C,S1U÷S1C等,下同)
    • E:新生代Eden区的占用百分比
    • O:老生代的占用百分比
    • M:元空间的占用百分比
    • CCS:压缩类空间的占用百分比
    • YGC(T)、FGC(T)、GCT的含义同上

    GC原因:-gccause

    # jstat -gccause 32968
      S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC                 
      0.00  11.77  84.45  13.80  97.54  95.73   1049    4.370     6    0.051    4.421 Allocation Failure   No GC               
    
    • LGCC:最近一次GC的原因
    • GCC:当前GC的原因(No GC表示当前未在GC)

    The End

    还有些事情要做,民那晚安晚安。

    相关文章

      网友评论

        本文标题:JVM工具命令之jstat小结

        本文链接:https://www.haomeiwen.com/subject/ggkpxktx.html