天天看点

Java进程状况之 jstat 命令一、概述二、说明三、输出选项四、统计选项和输出五、虚拟机标识符六、示例

 jstat 命令可用来打印目标 Java 进程的性能数据。

一、概述

此命令是实验性的,不受支持。
jstat -help|-options

jstat -<options> [-t] [-h<lines>] <vmid> [<interval> [<count>] ]
           
  • -help 输出帮助信息。
  • -options 显示静态选项列表。请参见输出选项。
  • -t 将时间戳列显示为输出的第一列。时间戳是自目标 JVM 开始时间以来的时间。
  • -h n 每 n 个样本(输出行)显示一个列标题,其中 n 是正整数。默认值为 0,显示第一行数据的列标题。
  • vmid 虚拟机标识符,它是指示目标 JVM 的字符串。请参见虚拟机标识符。
  • interval 以指定单位、秒或毫秒为单位的采样间隔。默认单位是毫秒。这必须是正整数。指定后,jstat 命令会在每个间隔产生输出。
  • count 要显示的样本数。默认值为无穷大,这将导致 jstat 命令显示统计信息,直到目标 JVM 终止或 jstat 命令终止。该值必须是正整数。

二、说明

jstat

命令显示已检测的 Java HotSpot 虚拟机的性能统计信息。目标 JVM 由其虚拟机标识符或 vmid 选项来标识。

jstat

命令支持两种类型的选项,常规选项和输出选项。常规选项使 jstat 命令显示简单的用法和版本信息。输出选项决定统计输出的内容和格式。

在未来版本中,所有选项及其功能可能会有所更改或删除。

三、输出选项

 如果不指定常规选项,则可以指定输出选项。输出选项决定了 jstat 命令输出的内容和格式,并且由一个 statOption 和任何其他输出选项(-h、-t 和 -J)组成。必须首先关注统计。

 输出格式为表格,列之间用空格隔开。标题行描述了列。使用-h选项设置标题显示的频率。不同选项之间的列标题名称是一致的。通常,如果两个选项提供了同名的列,则这两列的数据源是相同的。

 使用 -t 选项显示时间戳列,标记时间戳作为输出的第一列。时间戳列包含自目标 JVM 启动以来经过的时间,以秒为单位。时间戳的分辨率取决于各种因素,并且会因重载系统上的延迟线程调度而发生变化。

 使用间隔和计数参数分别确定 jstat 令显示其输出的频率和次数。

不要编写脚本来解析 jstat 命令的输出,因为格式在将来的版本中可能会改变。如果您编写了解析 jstat 命令输出的脚本,那么应该为该工具的未来版本修改它们。
  • -statOption

     确定 jstat 命令显示的统计信息。以下列出了可用的选项。使用 -options 常规选项显示特定平台安装的选项列表。请参见统计选项和输出。

    序号 统计项 描述
    1 class 显示有关类加载器行为的统计信息
    2 compiler 显示有关 Java HotSpot 虚拟机即时编译器行为的统计信息
    3 gc 显示垃圾收集堆行为的统计信息
    4 gccapacity 显示各代容量及其相应空间的统计信息
    5 gccause 显示垃圾收集统计信息(与 -gcutil 相同)的摘要,以及上次和当前(如果适用)垃圾收集事件的原因
    6 gcnew 显示新一代行为的统计数据
    7 gcnewcapacity 显示关于新一代大小及其相应空间的统计信息
    8 gcold 显示老一代行为的统计信息和元空间统计信息
    9 gcoldcapacity 显示关于老一代大小的统计数据
    10 gcmetacapacity 显示关于元空间大小的统计信息
    11 gcutil 显示垃圾收集统计信息的摘要
    12 printcompilation 显示 Java HotSpot 虚拟机编译方法统计信息
  • -JjavaOption

     将 Java 选项传递给Java应用程序启动器。例如,-J-Xms48m 将启动内存设置为 48 MB。有关选项的完整列表,请参见 java。

四、统计选项和输出

 以下信息总结了 jstat 命令为每个 statOption 输出的列。

  • -class option

     类装入器统计。

    序号 统计项 描述
    1 Loaded 加载的类的数目
    2 Bytes 加载的数量大小 KB
    3 Unloaded 卸载类数
    4 Bytes 卸载的数量大小 KB
    5 Time 执行类加载和卸载操作所花费的时间
  • -compiler option

     Java HotSpot 虚拟机即时编译器统计信息。

    序号 统计项 描述
    1 Compiled 执行编译任务数
    2 Failed 编译任务失败的次数
    3 Invalid 无效的编译任务数
    4 Time 执行编译任务花费的时间
    5 FailedType 上次编译失败的编译类型
    6 FailedMethod 上次编译失败的类名和方法
  • -gc option

     收集垃圾回收统计信息。

    序号 统计项 描述
    1 S0C 当前幸存区 0 容量(KB)
    2 S1C 当前幸存区 1 容量(KB)
    3 S0U 幸存区 0 使用大小(KB)
    4 S1U 幸存区 1 使用大小(KB)
    5 EC 当前 eden 空间容量(KB)
    6 EU eden 空间使用大小(KB)
    7 OC 当前旧空间容量(KB)
    8 OU 旧空间使用大小(KB)
    9 MC 元空间提交大小(KB)
    10 MU 元空间利用率(KB)
    11 CCSC 压缩类提交大小(KB)
    12 CCSU 使用的压缩类空间(KB)
    13 YGC 年轻一代垃圾收集事件的数量
    14 YGCT 年轻一代垃圾收集时间
    15 FGC 完整垃圾收集事件的数量
    16 FGCT 完全垃圾收集时间
    17 GCT 垃圾收集总时间
  • -gccapacity option

     收集堆内存统计信息。

    序号 统计项 描述
    1 NGCMN 最小新生代容量(KB)
    2 NGCMX 最大新生代容量(KB)
    3 NGC 当前新生代容量(KB)
    4 S0C 当前幸存区 0 容量(KB)
    5 S1C 当前幸存区 1 容量(KB)
    6 EC 当前 eden 空间容量(KB)
    7 OGCMN 老年代最小容量(KB)
    8 OGCMX 老年代最大容量(KB)
    9 OGC 当前老年代容量(KB)
    10 OC 当前老年代大小(KB)
    11 MCMN 最小元空间容量(KB)
    12 MCMX 最大元空间容量(KB)
    13 MC 元空间提交大小(KB)
    14 CCSMN 压缩类空间最小容量(KB)
    15 CCSMX 压缩类空间最大容量(KB)
    16 CCSC 压缩类提交大小(KB)
    17 YGC 年轻代垃圾收集事件的数量
    18 FGC 完整垃圾收集事件的数量
  • -gccause option

     此选项显示与 -gcutil 选项相同的垃圾收集统计信息摘要,但包括上次垃圾收集事件的原因和当前垃圾收集事件(如果适用)。除了为 -gcutil 列出的列之外,此选项还添加了以下列:

    序号 统计项 描述
    1 LGCC 上次垃圾收集的原因
    2 GCC 当前垃圾收集的原因
  • -gcnew option

     新生代垃圾回收统计信息。

    序号 统计项 描述
    1 S0C 当前幸存区 0 容量(KB)
    2 S1C 当前幸存区 1 容量(KB)
    3 S0U 当前幸存区 0 使用大小(KB)
    4 S1U 当前幸存区 0 使用大小(KB)
    5 TT 对象在新生代存活的次数
    6 MTT 对象在新生代存活的最大次数
    7 DSS 期望的幸存区大小(KB)
    8 EC eden 区的大小(KB)
    9 EU eden 区的使用大小(KB)
    10 YGC 年轻代垃圾回收次数
    11 YGCT 年轻代垃圾回收消耗时间
  • -gcnewcapacity option

     新生代内存信息统计。

    序号 统计项 描述
    1 NGCMN 新生代最小容量(KB)
    2 NGCMX 新生代最大容量(KB)
    3 NGC 当前新生代容量(KB)
    4 S0CMX 最大幸存 0 区大小(KB)
    5 S0C 当前幸存 0 区大小(KB)
    6 S1CMX 最大幸存 1 区大小(KB)
    7 S1C 当前幸存 1 区大小(KB)
    8 ECMX 最大 eden 区大小(KB)
    9 EC 当前 eden 区大小(KB)
    10 YGC 年轻代垃圾回收次数
    11 FGC 老年代回收次数
  • -gcold option

     老年代垃圾回收信息统计。

    序号 统计项 描述
    1 MC 方法区大小(KB)
    2 MU 方法区使用大小(KB)
    3 CCSC 压缩类空间大小(KB)
    4 CCSU 压缩类空间使用大小(KB)
    5 OC 老年代大小(KB)
    6 OU 老年代使用大小(KB)
    7 YGC 年轻代垃圾回收次数
    8 FGC 老年代垃圾回收次数
    9 FGCT 老年代垃圾回收消耗时间
    10 GCT 垃圾回收消耗总时间
  • -gcoldcapacity option

     老年代内存信息统计。

    序号 统计项 描述
    1 OGCMN 老年代最小容量(KB)
    2 OGCMX 老年代最大容量(KB)
    3 OGC 当前老年代大小(KB)
    4 OC 老年代大小(KB)
    5 YGC 年轻代垃圾回收次数
    6 FGC 老年代垃圾回收次数
    7 FGCT 老年代垃圾回收消耗时间
    8 GCT 圾回收消耗总时间
  • -gcmetacapacity option

     元数据空间信息统计。

    序号 统计项 描述
    1 MCMN 最小元数据容量
    2 MCMX 最大元数据容量
    3 MC 当前元数据空间大小
    4 CCSMN 最小压缩类空间大小
    5 CCSMX 最大压缩类空间大小
    6 CCSC 当前压缩类空间大小
    7 YGC 年轻代垃圾回收次数
    8 FGC 老年代垃圾回收次数
    9 FGCT 老年代垃圾回收消耗时间
    10 GCT 垃圾回收消耗总时间
  • -gcutil option

     总结垃圾回收信息统计。

    序号 统计项 描述
    1 S0 幸存1区当前使用比例
    2 S1 幸存2区当前使用比例
    3 E eden 区使用比例
    4 O 老年代使用比例
    5 M 元数据区使用比例
    6 CCS 压缩使用比例
    7 YGC 年轻代垃圾回收次数
    8 YGCT 年轻代垃圾收集时间
    9 FGC 老年代垃圾回收次数
    10 FGCT 老年代垃圾回收消耗时间
    11 GCT 垃圾回收消耗总时间
  • -printcompilation option

     JVM编译方法信息统计。

    序号 统计项 描述
    1 Compiled 最近编译方法的数量
    2 Size 最近编译方法的字节码数量
    3 Type 最近编译方法的编译类型
    4 Method 方法名标识

五、虚拟机标识符

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

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

 vmid 字符串的语法对应于 URI 的语法。vmid 字符串可以从表示本地 JVM 的简单整数变化到指定通信协议、端口号和其他特定于实现的值的更复杂的结构。

  • protocol

     通信协议。如果省略 protocol 值并且未指定主机名,则默认协议是特定于平台的优化本地协议。如果省略 protocol 值并指定主机名,则默认协议为 rmi。

  • lvmid

     目标 JVM 的本地虚拟机标识符。lvmid 是特定于平台的值,它唯一标识系统上的 JVM。lvmid 是虚拟机标识符唯一必需的组件。lvmid 通常是但不一定是目标 JVM 进程的操作系统进程标识符。如果 JVM 进程没有在单独的 docker 实例中运行,您可以使用 jps 命令来确定 lvmid。您还可以使用 ps 命令在 Oracle Solaris、Linux 和 macOS 平台上确定 lvmid,并使用窗口任务管理器在窗口上确定 lvmid。

    JDK 10 增加了在附加到运行在独立备审进程中的 Java 进程时使用附加应用编程接口的支持。但是,jps 命令不会列出在单独的 docker 实例中运行的 JVM 进程。如果您试图将一个 Linux 主机与一个位于 docker 容器中的虚拟机连接起来,您必须使用诸如 ps 之类的工具来查找 JVM 的 PID。
  • hostname

     指示目标主机的主机名或 IP 地址。如果省略 hostname 值,则目标主机是本地主机。

  • port

     与远程服务器通信的默认端口。如果 hostname 值被省略,或者协议值指定了优化的本地 protocol,则 port 值被忽略。否则,port 参数的处理是特定于实现的。对于默认 rmi 协议,端口值指示远程主机上 rmiprotocol 的端口号。如果 port 值被省略并且 protocol 值指示rmi,则使用默认 rmiregistry 端口(1099)。

  • servername

     servername 参数的处理取决于实现。对于优化的本地协议,此字段被忽略。对于 rmi 协议,它表示远程主机上 RMI 远程对象的名称。

六、示例

 本节介绍一些监控 lvmid 为 21891 的本地 JVM 的示例。

  • -gcutil 选项

     此示例将监控 lvmid 为 21891 的进程,并以 250 毫秒的间隔进行 7 个采样,并显示 -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
               
     此示例的输出显示在第三和第四样本之间发生了年轻代收集。 收集耗时 0.078 秒,并将对象从 eden 空间(E)提升到旧空间(O),从而使旧空间利用率从 66.80% 提高到 68.19%。 在收集之前,幸存者空间的利用率为 97.02%,但是在收集之后,利用率为 91.03%。
  • 重复显示列标题

     此示例将监控 lvmid 为 21891 的进程,并以 250 毫秒的间隔进行采样,并显示 -gcnew 选项指定的输出。 另外,它使用 -h3 选项在每三行数据之后输出列标题。

    jstat -gcnew -h3 21891 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 秒。 集合发现了足够的活动数据,以至于生存空间 0 利用率(S0U)将超过所需的生存空间大小(DSS)。 结果,对象被提升为旧一代(在此输出中不可见),并且任职期限(TT)从 31 降低为 2。

     在第五个和第六个样本之间发生另一个收集。 该集合发现的幸存者很少,并将任期阈值恢复为31。

  • 带时间戳输出

     此示例连接到 lvmid 21891,并以 250 毫秒的间隔进行 3 个采样。 -t 选项用于为第一列中的每个样本生成时间戳。

    jstat -gcoldcapacity -t 21891 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
               
     “时间戳”列报告自目标 JVM 启动以来经过的时间(以秒为单位)。 此外,-gcoldcapacity 输出显示,随着堆扩展以满足分配或升级需求,当前老年代容量(OGC)和老年代容量(OC)会增加。 在老年代回收(FGC)第 80 次后,当前老年代容量(OGC)从 11696 KB 增加到 13820 KB。 生成的最大容量(和空间)为60544 KB(OGCMX),因此仍有扩展空间。
  • 监控远程JVM

     该示例使用 -gcutil 选项连接到名为 remote.domain 的系统上的 lvmid 40496,并无限期地采样。

    jstat -gcutil [email protected] 1000
               
     lvmid 与远程主机的名称组合以构建 [email protected] 的 vmid。 此 vmid 导致使用 rmi 协议与远程主机上的默认 jstatd 服务器进行通信。 jstatd 服务器使用 remote.domain 上的 rmiregistry 命令定位,该命令绑定到 rmiregistry 命令的默认端口(端口1099)。