JVM 命令之 jstat 详解

 2023-01-16
原文作者:阿宝的功夫梦 原文地址:https://juejin.cn/post/6916755975244365837

JSTAT COMMAND

监控JVM统计数据,这个命令是实验性的,不支持

概要

jstat [generalOption | outputOptions vmid [interval[s|ms][count]]]

  • generalOption : 通用命令行选项 -help或者options。查看General Options。
  • outputOptions : 一个或多个输出选项,由单个statOption组成,加上-t、-h和-J选项中的任何一个。
  • vmid : 虚拟机标志,指定目标JVM的字符串。通常语法如下:[protocol:][//]lvmid[@hostname[:port]/servername]vmid字符串的语法对应URI的语法。
  • interval[s|ms] : 以指定单位【秒|毫秒】间隔取样。默认是毫秒。必须是正数。当指定参数时,jstat命令会在每个间隔输出数据。
  • count : 展示样本的数量。必须是正数,默认展示直到JVM中断,或者jstat命令中断。

描述

jstat命令显示有导航Java HotSpot VM的性能统计信息。 目标JVM由其虚拟机标识符或vmid选项标识。

虚拟机标识符

vmid字符串语法对应URI的语法:

[protocol:][//]lvmid[@hostname[:port]/servername]

  • protocol : 连接协议。如果省略了协议值,没有指定主机名,那么默认协议就是特定于平台的优化本地协议。 如果省略协议值并指定主机名,则默认协议为rmi。
  • lvmid : 目标JVM的本地虚拟机标识符。lvmid是系统识别JVM的平台指定值,是虚拟机标识符唯一需要的组件。lvmid通常是但不一定是目标JVM进程的操作系统进程标识符。可以用JPS命令来确定lvmid。同样也可以在Solaris,Linux, OS X平台用`ps``命令,在Windows用任务管理器来确定。
  • hostname : 目标主机的名称或者IP地址。如果省略主机名,目标主机就是本地主机。
  • port : 连接远程服务的默认端口号。如果省略主机名值或协议值指定优化的本地协议,则忽略端口值,否则,端口参数的处理是特定实现的。对于默认的rmi协议,端口值指示远程主机上rmiregistry的端口号。 如果省略端口值,协议值指示rmi,则使用默认的rmiregistry端口(1099)。
  • servername : servername参数的处理取决于具体实现。对于优化的本地协议,这个属性是忽略的。对于rmi协议,它表示远程主机上RMI远程对象是我名称。

选项

jstat支持两个类型的选项,general optionsoutput options。通用选项显示简单的使用和版本信息。输出选项决定内容和统计数据的格式。所有的选项和功能都将在未来的版本中改变和移除。

General Options

如果指定通用选项其中一个,就不能指定任何其他的选项或参数。

  • -help

    展示帮助信息。

  • -options

    展示静态选项列表。看Output Options

Output Options

如果不指定通用选项,可以指定输出选项。输出选项决定jstat命令输出的内容和格式。单个statOption加上其他的选项(-h,-t,-J)。statOption在前面。

使用-t选项展示时间戳栏,在输出的第一栏标记为Timestamp。这一栏包含从目标JVM开始消耗的时间,单位秒。

使用间隔和次数参数来决定命令输出的频率。

注意:不要编写脚本来解析jstat命令的输出,因为格式可能会在以后的版本中发生变化。 如果您编写了解析jstat命令输出的脚本,那么希望为该工具的未来版本修改它们。

  • statOption

    决定jstat命令展示的统计信息。以下是可用选项,使用-options通用选项来展示为特定平台安装的选项列表。看Stat Options and Output

    • class : 展示有关类加载器行为的统计信息。
    • compiler : 展示Java HotSpot VM JIT编译行为的统计信息。
    • gc : 展示垃圾回收堆行为的统计信息。
    • gccapacity : 展示世代及他们对应空间容量的统计信息。
    • gccause : 显示有关垃圾收集统计的摘要(与-gcutil相同),并显示上次和当前(适用时)垃圾收集事件的原因。
    • gcnew : 展示新生代行为的统计信息。
    • gcnewcapacity : 展示新生代及对应空间大小的统计信息。
    • gcold : 展示老年代及元数据区行为的统计信息。
    • gcoldcapacity : 展示老年代空间的统计信息。
    • gcmetacapacity : 展示元空间大小的统计信息。
    • gcutil : 展示垃圾回收统计信息摘要。
    • printcompilation : 展示Java HotSpot VM编译方法统计信息。
  • -h n

    每N个样本(输出行数)展示列头,N是正整数。默认是0,在数据的第一行展示列头。

  • -t

    在输出的第一栏展示时间戳(从目标JVM开启的时间开始)。

  • -JjavaOption

    将java选项传递给Java应用程序启动程序。例如:-J-Xms48m表示设置启动为48m。可查看java命令。

Stat Options and Output

以下是jstat命令输出每列的摘要信息。

  • -class option

    类加载统计信息

    • Loaded : 加载类的数量
    • Bytes : 加载的kB的数
    • Unloaded : 卸载类的数量
    • Bytes : 卸载的kB的数
    • Time : 执行类加载和卸载操作花费的时间
  • -compiler option

    Java HotSpot VM JIT 编译统计数据

    • Compiled : 编译任务执行的数量
    • Failed : 编译任务失败的数量
    • Invalid : 无效的编译任务的数量
    • Time : 执行编译任务的时间
    • FailedType : 上次失败编译的类型
    • FailedMethod : 上次失败编译的方法和类名
  • -gc option

    回收垃圾堆统计信息,单位KB。

    • S0C : 当前Survivor空间0的容量
  • S1C : 当前Survivor空间1的容量

    • S0U : Survivor空间0已用
  • S1U : Survivor空间1已用

    • EC : 当前eden区空间容量
  • EU : eden区已用

    • OC : 当前老年代空间容量
  • OU : 老年代已用

    • MC : 元空间容量
  • MU : 元空间已用

    • CCSC : 压缩类空间容量
  • CCSU : 压缩类空间已用

    • YGC : 年轻代垃圾回收时间的数量
  • YGCT : 年轻代垃圾回收的时间

    • FGC : Full GC事件的数量
  • FGCT : FUll GC时间

    • GCT : 总的垃圾回收时间
  • -gccapacity option

    世代内存池和空间容量,单位KB。

    Note(COPIED) : I just seek from the jdk source

    in short: OGC = sum(all OC)

    A gen may contain MORE THAN ONE spaces.

    However, Hotspot old gen has only 1 space ( young gen has 3: eden , s0 and s1 ), jstat shows the same value for them.

    • NGCMN : 最小新生代容量
    • NGCMX : 最大新生代容量
    • NGC : 当前新生代容量
    • S0C : 当前Survivor空间0的容量
    • S1C : 当前Survivor空间1的容量
    • EC : 当前eden区的容量
    • OGCMN : 最小老年代容量
    • OGCMX : 最大老年代容量
    • OGC : 当前老年代容量
    • OC : 当前老年空间容量
    • MCMN : 最小元空间容量
    • MCMX : 最大元空间容量
    • MC : 元空间容量
    • CCSMN : 压缩类空间最小容量
    • CCSMX : 压缩类空间最大容量
    • CCSC : 压缩类空间容量
    • YGC : 年轻代GC事件的数量
    • FGC : Full GC事件的数量
  • -gccause option

    这个选项展示和-gcutil一样垃圾回收统计信息的摘要,但是包含了上次和当前垃圾回收(应用时)事件的原因。除了为-gcutil列出的列外,此选项还添加以下列。

    • LGCC : 上次垃圾回收的原因
    • GCC : 当前垃圾回收的原因
  • -gcnew option

    新生代统计信息

    • S0C : 当前Survivor空间0的容量
    • S1C : 当前Survivor空间1的容量
    • S0U : Survivor空间0已用
    • S1U : Survivor空间1已用
    • TT : 占有阈值
    • MTT : 最大占有阈值
    • DSS : 需要的Survivor大小
    • EC : 当前eden区容量
    • EU : eden区已用
    • YGC : 年轻代GC事件的数量
    • YGCT : 年轻代垃圾回收时间
  • -gcnewcapacity option

    新生代空间统计信息,单位KB。

    • NGCMN : 最小新生代容量
    • NGCMX : 最大新生代容量
    • NGC : 当前新生代容量
    • SOCMX : 最大Survivor空间0容量
    • S0C : 当前Survivor空间0容量
    • S1CMX : 最大Survivor空间1容量
    • S1C : 当前Survivor空间1容量
    • ECMX : 最大eden空间容量
    • EC : 当前eden去空间容量
    • YGC : 年轻代GC事件的数量
    • FGC : Full GC事件的数量
  • -gcold option

    老年代和元空间行为统计信息,单位KB。

    • MC : 元空间容量
    • MU : 元空间已用
    • CCSC : 压缩类空间容量
    • CCSU : 压缩类空间已用
    • OC : 当前年老区空间容量
    • CU : 老年区已用
    • YGC : 年轻代GC事件的数量
    • FGC : Full GC事件的数量
    • FGCT : Full GC时间
    • GCT : 总的垃圾回收时间
  • -gcoldcapacity option

    老年代大小统计信息,单位KB。

    • OGCMN : 最小老年代容量
    • OGCMX : 最大老年代容量
    • OGC : 当前老年代容量
    • OC : 当前年老区空间容量
    • YGC : 年轻代GC事件的数量
    • FGC : Full GC事件的数量
    • FGCT : Full GC时间
    • GCT : 总的垃圾回收时间
  • -gcmetacapacity option

    元空间大小统计信息,单位KB。

    • MCMN : 最小元空间容量
    • MCMX : 最大元空间容量
    • MC : 元空间容量
    • CCSMN : 压缩类空间最小容量
    • CCSMX : 压缩类空间最大容量
    • YGC : 年轻代GC事件的数量
    • FGC : Full GC事件的数量
    • FGCT : Full GC时间
    • GCT : 总的垃圾回收时间
  • -gcutil option

    垃圾回收统计信息摘要

    • S0 : 空间当前容量Survivor空间0已用百分比
    • S1 : 空间当前容量Survivor空间1已用百分比
    • E : 空间当前容量eden区已用百分比
    • O : 空间当前容量年老区已用百分比
    • M : 空间当前空量元空间已用百分比
    • CCS : 压缩类空间已用百分比
    • YGC : 年轻代GC事件数量
    • YGCT : 年轻代垃圾回收事件
    • FGC : Full GC事件数量
    • FGCT : Full GC事件
    • GCT : 总的垃圾回收时间
  • -printcompilation option

    Java HotSpot VM编译方法统计信息

    • Compiled : 最近编译的方法执行的编译任务数
    • Size : 最近编译的方法字节码大小
    • Type : 最近编译的方法的编译类型
    • Method : 最近编译的方法的类名和方法名。类名使用/而不是.作为命名空间分割符。

示例

本地JVM(lvmid为21891)的监控情况示例。

The gcutil Option

这个例子连接本地21891的JVM,取7个样本,间隔时间为250ms,指定-gcutil选项来展示输出内容

    jstat -gcutil 21891 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

这个示例显示在第三个和第四个样本发生了一次young GC。GC花费了0.078秒并促使eden区的对象转移到老年区,老年区的使用率从66.8%上升到68.19%。在GC之前,Survivor空间使用率为97.02%,GC之后下降到91.03%。

参考

  1. OC与OGC的区别
  2. Oracle-jstat文档