Java进程状况之 jstat 命令

本文详细介绍jstat命令的使用方法和参数选项,包括如何监控Java进程的性能数据,如类加载器、即时编译器和垃圾收集等行为。文章还解释了如何通过不同的选项获取特定的统计信息,并提供了一些示例来展示如何实际应用这些命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 常规选项显示特定平台安装的选项列表。请参见统计选项和输出。
    序号统计项描述
    1class显示有关类加载器行为的统计信息
    2compiler显示有关 Java HotSpot 虚拟机即时编译器行为的统计信息
    3gc显示垃圾收集堆行为的统计信息
    4gccapacity显示各代容量及其相应空间的统计信息
    5gccause显示垃圾收集统计信息(与 -gcutil 相同)的摘要,以及上次和当前(如果适用)垃圾收集事件的原因
    6gcnew显示新一代行为的统计数据
    7gcnewcapacity显示关于新一代大小及其相应空间的统计信息
    8gcold显示老一代行为的统计信息和元空间统计信息
    9gcoldcapacity显示关于老一代大小的统计数据
    10gcmetacapacity显示关于元空间大小的统计信息
    11gcutil显示垃圾收集统计信息的摘要
    12printcompilation显示 Java HotSpot 虚拟机编译方法统计信息
  • -JjavaOption
     将 Java 选项传递给 Java 应用程序启动器。例如,-J-Xms48m 将启动内存设置为 48 MB。有关选项的完整列表,请参见 java

四、统计选项和输出

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

  • -class option
     类装入器统计。
    序号统计项描述
    1Loaded加载的类的数目
    2Bytes加载的数量大小 KB
    3Unloaded卸载类数
    4Bytes卸载的数量大小 KB
    5Time执行类加载和卸载操作所花费的时间
  • -compiler option
     Java HotSpot 虚拟机即时编译器统计信息。
    序号统计项描述
    1Compiled执行编译任务数
    2Failed编译任务失败的次数
    3Invalid无效的编译任务数
    4Time执行编译任务花费的时间
    5FailedType上次编译失败的编译类型
    6FailedMethod上次编译失败的类名和方法
  • -gc option
     收集垃圾回收统计信息。
    序号统计项描述
    1S0C年轻代中第 1 个 survivor(幸存区)的容量上限(KB)
    2S1C年轻代中第 2 个 survivor(幸存区)的容量上限(KB)
    3S0U年轻代中第 1 个 survivor(幸存区)的已使用容量(KB)
    4S1U年轻代中第 2 个 survivor(幸存区)的已使用容量(KB)
    5EC年轻代中 Eden(伊甸园)空间容量上限(KB)
    6EU年轻代中 Eden(伊甸园)空间已使用容量(KB)
    7OC老年代空间容量上限(KB)
    8OU老年代已使用容量(KB)
    9MC元空间提交大小(KB)
    10MU元空间利用率(KB)
    11CCSC压缩类提交大小(KB)
    12CCSU使用的压缩类空间(KB)
    13YGC年轻代 GC 总次数
    14YGCT年轻代 GC 总耗时(秒)
    15FGC老年代 GC 总次数
    16FGCT老年代 GC 总耗时(秒)
    17GCTGC 总耗时(秒)
  • -gccapacity option
     收集堆内存统计信息。
    序号统计项描述
    1NGCMN最小新生代容量(KB)
    2NGCMX最大新生代容量(KB)
    3NGC当前新生代容量(KB)
    4S0C当前幸存区 0 容量(KB)
    5S1C当前幸存区 1 容量(KB)
    6EC当前 eden 空间容量(KB)
    7OGCMN老年代最小容量(KB)
    8OGCMX老年代最大容量(KB)
    9OGC当前老年代容量(KB)
    10OC当前老年代大小(KB)
    11MCMN最小元空间容量(KB)
    12MCMX最大元空间容量(KB)
    13MC元空间提交大小(KB)
    14CCSMN压缩类空间最小容量(KB)
    15CCSMX压缩类空间最大容量(KB)
    16CCSC压缩类提交大小(KB)
    17YGC年轻代 GC 总次数
    18FGC老年代 GC 总次数
  • -gccause option
     此选项显示与 -gcutil 选项相同的垃圾收集统计信息摘要,但包括上次垃圾收集事件的原因和当前垃圾收集事件(如果适用)。除了为 -gcutil 列出的列之外,此选项还添加了以下列:
    序号统计项描述
    1LGCC上次垃圾收集的原因
    2GCC当前垃圾收集的原因
  • -gcnew option
     新生代垃圾回收统计信息。
    序号统计项描述
    1S0C当前幸存区 0 容量(KB)
    2S1C当前幸存区 1 容量(KB)
    3S0U当前幸存区 0 使用大小(KB)
    4S1U当前幸存区 0 使用大小(KB)
    5TT对象在新生代存活的次数
    6MTT对象在新生代存活的最大次数
    7DSS期望的幸存区大小(KB)
    8ECeden 区的大小(KB)
    9EUeden 区的使用大小(KB)
    10YGC年轻代 GC 总次数
    11YGCT年轻代 GC 总耗时(秒)
  • -gcnewcapacity option
     新生代内存信息统计。
    序号统计项描述
    1NGCMN新生代最小容量(KB)
    2NGCMX新生代最大容量(KB)
    3NGC当前新生代容量(KB)
    4S0CMX最大幸存 0 区大小(KB)
    5S0C当前幸存 0 区大小(KB)
    6S1CMX最大幸存 1 区大小(KB)
    7S1C当前幸存 1 区大小(KB)
    8ECMX最大 eden 区大小(KB)
    9EC当前 eden 区大小(KB)
    10YGC年轻代 GC 总次数
    11FGC老年代 GC 总次数
  • -gcold option
     老年代垃圾回收信息统计。
    序号统计项描述
    1MC方法区大小(KB)
    2MU方法区使用大小(KB)
    3CCSC压缩类空间大小(KB)
    4CCSU压缩类空间使用大小(KB)
    5OC老年代大小(KB)
    6OU老年代使用大小(KB)
    7YGC年轻代 GC 总次数
    8FGC老年代 GC 总次数
    9FGCT老年代 GC 总耗时(秒)
    10GCTGC 总耗时(秒)
  • -gcoldcapacity option
     老年代内存信息统计。
    序号统计项描述
    1OGCMN老年代最小容量(KB)
    2OGCMX老年代最大容量(KB)
    3OGC当前老年代大小(KB)
    4OC老年代大小(KB)
    5YGC年轻代 GC 总次数
    6FGC老年代 GC 总次数
    7FGCT老年代 GC 总耗时(秒)
    8GCTGC 总耗时(秒)
  • -gcmetacapacity option
     元数据空间信息统计。
    序号统计项描述
    1MCMN最小元数据容量
    2MCMX最大元数据容量
    3MC当前元数据空间大小
    4CCSMN最小压缩类空间大小
    5CCSMX最大压缩类空间大小
    6CCSC当前压缩类空间大小
    7YGC年轻代 GC 总次数
    8FGC老年代 GC 总次数
    9FGCT老年代 GC 总耗时(秒)
    10GCTGC 总耗时(秒)
  • -gcutil option
     总结垃圾回收信息统计。
    序号统计项描述
    1S0幸存1区当前使用比例
    2S1幸存2区当前使用比例
    3EEden(伊甸园)空间容量使用比例
    4O老年代空间容量使用比例
    5M元数据区使用比例
    6CCS压缩使用比例
    7YGC年轻代 GC 总次数
    8YGCT年轻代 GC 总耗时(秒)
    9FGC老年代 GC 总次数
    10FGCT老年代 GC 总耗时(秒)
    11GCTGC 总耗时(秒)
  • -printcompilation option
     JVM编译方法信息统计。
    序号统计项描述
    1Compiled最近编译方法的数量
    2Size最近编译方法的字节码数量
    3Type最近编译方法的编译类型
    4Method方法名标识

五、虚拟机标识符

 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 40496@remote.domain 1000
    

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值