The jstat Command

名称

jstat - 监控JVM统计信息

概要

注意:此命令是实验性的,不受支持。

jstat generalOptions

jstat outputOptions [-t] [-h lines] vmid [interval [count]]

generalOptions
单个通用命令行选项。请参阅通用选项
outputOptions
-options选项报告的选项。一个或多个由单个statOption组成的输出选项,以及任何-t-h-J选项。请参阅jstat命令的输出选项
-t
在输出的第一列显示时间戳列。时间戳是目标JVM启动时间以来的时间。
-h n
n个样本(输出行)显示一次列标题,其中n是正整数。默认值为0,显示数据的第一行的列标题。
vmid
虚拟机标识符,是一个指示目标JVM的字符串。请参阅虚拟机标识符
interval
指定单位(秒(s)或毫秒(ms))的采样间隔。默认单位为毫秒。这必须是正整数。当指定时,jstat命令在每个间隔处生成其输出。
count
要显示的样本数。默认值为无穷大,这会导致jstat命令显示统计信息,直到目标JVM终止或jstat命令终止。此值必须是正整数。

描述

jstat命令显示一个被仪器化的Java HotSpot VM的性能统计信息。目标JVM由其虚拟机标识符或vmid选项标识。

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

所有选项及其功能可能会在将来的版本中更改或移除。

通用选项

如果指定了通用选项之一,则不能指定任何其他选项或参数。

-help
显示帮助消息。
-options
显示静态选项列表。请参阅jstat命令的输出选项

jstat命令的输出选项

如果不指定通用选项,则可以指定输出选项。输出选项确定jstat命令输出的内容和格式,并由单个statOption组成,以及其他输出选项(-h-t-J)。statOption必须首先出现。

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

使用-t选项显示一个时间戳列,标记为Timestamp,作为输出的第一列。时间戳列包含自目标JVM启动以来经过的时间(以秒为单位)。时间戳的分辨率取决于各种因素,并且由于在负载繁重的系统上延迟线程调度而导致的变化而有所不同。

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

注意:

不要编写解析jstat命令输出的脚本,因为格式可能会在将来的版本中更改。如果编写解析jstat命令输出的脚本,则应预期为此工具的将来版本修改它们。

-statOption

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

class:显示有关类加载器行为的统计信息。

compiler:显示有关Java HotSpot VM即时编译器行为的统计信息。

gc:显示有关垃圾收集堆行为的统计信息。

gccapacity:显示有关各代和其对应空间容量的统计信息。

gccause:显示有关垃圾收集统计信息的摘要(与-gcutil相同),以及最后一次和当前(适用时)垃圾收集事件的原因。

gcnew:显示有关新生代行为的统计信息。

gcnewcapacity:显示有关新生代及其对应空间大小的统计信息。

gcold:显示有关老年代和元空间统计信息的行为。

gcoldcapacity:显示有关老年代大小的统计信息。

gcmetacapacity:显示有关元空间大小的统计信息。

gcutil:显示有关垃圾收集统计信息的摘要。

printcompilation:显示Java HotSpot VM编译方法统计信息。

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

统计选项和输出

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

-class 选项

类加载器统计信息。

已加载: 加载的类数量。

字节: 加载的KB数量。

未加载: 卸载的类数量。

字节: 卸载的KB数量。

时间: 执行类加载和卸载操作所花费的时间。

-compiler 选项

Java HotSpot VM 即时编译器统计信息。

已编译: 执行的编译任务数量。

失败: 失败的编译任务数量。

无效: 无效的编译任务数量。

时间: 执行编译任务所花费的时间。

失败类型: 最后一次失败编译的编译类型。

失败方法: 最后一次失败编译的类名和方法名。

-gc 选项

垃圾回收堆统计信息。

S0C: 当前幸存者空间 0 容量(KB)。

S1C: 当前幸存者空间 1 容量(KB)。

S0U: 幸存者空间 0 利用率(KB)。

S1U: 幸存者空间 1 利用率(KB)。

EC: 当前伊甸空间容量(KB)。

EU: 伊甸空间利用率(KB)。

OC: 当前老年空间容量(KB)。

OU: 老年空间利用率(KB)。

MC: 元空间已提交大小(KB)。

MU: 元空间利用率(KB)。

CCSC: 压缩类已提交大小(KB)。

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

YGC: 年轻代垃圾回收(GC)事件数量。

YGCT: 年轻代垃圾回收时间。

FGC: 完全GC事件数量。

FGCT: 完全垃圾回收时间。

GCT: 总垃圾回收时间。

-gccapacity 选项

内存池代和空间容量。

NGCMN: 最小新生代容量(KB)。

NGCMX: 最大新生代容量(KB)。

NGC: 当前新生代容量(KB)。

S0C: 当前幸存者空间 0 容量(KB)。

S1C: 当前幸存者空间 1 容量(KB)。

EC: 当前伊甸空间容量(KB)。

OGCMN: 最小老年代容量(KB)。

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

OGC: 当前老年代容量(KB)。

OC: 当前老年空间容量(KB)。

MCMN: 最小元空间容量(KB)。

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

MC: 元空间已提交大小(KB)。

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

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

CCSC: 压缩类已提交大小(KB)。

YGC: 年轻代GC事件数量。

FGC: 完全GC事件数量。

-gccause 选项

此选项显示与-gcutil选项相同的垃圾回收统计摘要,但包括最后一次垃圾回收事件的原因以及(如果适用)当前垃圾回收事件的原因。除了-gcutil列出的列外,此选项还添加了以下列:

LGCC: 最后一次垃圾回收的原因

GCC: 当前垃圾回收的原因

-gcnew 选项

新生代统计信息。

S0C: 当前幸存者空间 0 容量(KB)。

S1C: 当前幸存者空间 1 容量(KB)。

S0U: 幸存者空间 0 利用率(KB)。

S1U: 幸存者空间 1 利用率(KB)。

TT: 保留阈值。

MTT: 最大保留阈值。

DSS: 期望幸存者大小(KB)。

EC: 当前伊甸空间容量(KB)。

EU: 伊甸空间利用率(KB)。

YGC: 年轻代GC事件数量。

YGCT: 年轻代垃圾回收时间。

-gcnewcapacity 选项

新生代空间大小统计信息。

NGCMN: 最小新生代容量(KB)。

NGCMX: 最大新生代容量(KB)。

NGC: 当前新生代容量(KB)。

S0CMX: 最大幸存者空间 0 容量(KB)。

S0C: 当前幸存者空间 0 容量(KB)。

S1CMX: 最大幸存者空间 1 容量(KB)。

S1C: 当前幸存者空间 1 容量(KB)。

ECMX: 最大伊甸空间容量(KB)。

EC: 当前伊甸空间容量(KB)。

YGC: 年轻代GC事件数量。

FGC: 完全GC事件数量。

-gcold 选项

老年代大小统计信息。

MC: 元空间已提交大小(KB)。

MU: 元空间利用率(KB)。

CCSC: 压缩类已提交大小(KB)。

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

OC: 当前老年空间容量(KB)。

OU: 老年空间利用率(KB)。

YGC: 年轻代GC事件数量。

FGC: 完全GC事件数量。

FGCT: 完全垃圾回收时间。

GCT: 总垃圾回收时间。

-gcoldcapacity 选项

老年代统计信息。

OGCMN: 最小老年代容量(KB)。

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

OGC: 当前老年代容量(KB)。

OC: 当前老年空间容量(KB)。

YGC: 年轻代GC事件数量。

FGC: 完全GC事件数量。

FGCT: 完全垃圾回收时间。

GCT: 总垃圾回收时间。

-gcmetacapacity 选项

元空间大小统计信息。

MCMN: 最小元空间容量(KB)。

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

MC: 元空间已提交大小(KB)。

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

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

YGC: 年轻代GC事件数量。

FGC: 完全GC事件数量。

FGCT: 完全垃圾回收时间。

GCT: 总垃圾回收时间。

-gcutil 选项

垃圾回收统计摘要。

S0: 幸存者空间 0 利用率占当前容量的百分比。

S1: 幸存者空间 1 利用率占当前容量的百分比。

E: 伊甸空间利用率占当前容量的百分比。

O: 老年空间利用率占当前容量的百分比。

M: 元空间利用率占当前容量的百分比。

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

YGC: 年轻代GC事件数量。

YGCT: 年轻代垃圾回收时间。

FGC: 完全GC事件数量。

FGCT: 完全垃圾回收时间。

GCT: 总垃圾回收时间。

-printcompilation 选项

Java HotSpot VM 编译器方法统计信息。

已编译: 最近编译方法执行的编译任务数量。

大小: 最近编译方法的字节码字节数。

类型: 最近编译方法的编译类型。

方法: 标识最近编译方法的类名和方法名。类名使用斜杠(/)而不是点(.)作为命名空间分隔符。方法名是指定类中的方法。这两个字段的格式与HotSpot -XX:+PrintCompilation选项一致。

虚拟机标识符

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

[协议:][//]lvmid[@主机名[:端口][/服务器名]

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

协议
通信协议。如果省略了协议值并且未指定主机名,则默认协议是特定于平台的优化本地协议。如果省略了协议值并且指定了主机名,则默认协议是rmi
lvmid
目标JVM的本地虚拟机标识符。lvmid是一个特定于平台的值,用于唯一标识系统上的JVM。lvmid是虚拟机标识符的唯一必需组件。通常,lvmid是目标JVM进程的操作系统进程标识符,但不一定是这样。您可以使用jps命令来确定lvmid,前提是JVM进程未在单独的docker实例中运行。您还可以使用Linux和macOS平台上的ps命令以及Windows上的Windows任务管理器来确定lvmid
主机名
指示目标主机的主机名或IP地址。如果省略了主机名值,则目标主机是本地主机。
端口
与远程服务器通信的默认端口。如果省略了主机名值或协议值指定了优化的本地协议,则忽略端口值。否则,端口参数的处理是特定于实现的。对于默认的rmi协议,端口值表示远程主机上rmiregistry的端口号。如果省略了端口值并且协议值指示rmi,则使用默认的rmiregistry端口(1099)。
服务器名称
服务器名称参数的处理取决于实现。对于优化的本地协议,此字段将被忽略。对于rmi协议,它表示远程主机上RMI远程对象的名称。

示例

本节介绍了一些监视具有lvmid为21891的本地JVM的示例。

gcutil选项

此示例附加到lvmid 21891,并以250毫秒间隔进行7次采样,并按-gcutil选项指定的方式显示输出。

此示例的输出显示,在第三次和第四次采样之间发生了一次年轻代收集。收集耗时0.078秒,并将对象从伊甸园空间(E)提升到老年代空间(O),导致老年代利用率从66.80%增加到68.19%。在收集之前,幸存者空间利用率为97.02%,但在此次收集后,它的利用率为91.03%。

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

重复列标题字符串

此示例附加到lvmid 21891,并以250毫秒间隔进行采样,并按-gcnew选项指定的方式显示输出。此外,它使用-h3选项在每3行数据后输出列标题。

除了显示重复的标题字符串外,此示例还显示了在第二次和第三次采样之间发生了一次年轻代GC。其持续时间为0.001秒。收集发现足够的活动数据,使得幸存者空间0利用率(S0U)将超过期望的幸存者大小(DSS)。因此,对象被提升到老年代(在此输出中不可见),并且终身阈值(TT)从31降低到2。

在第五次和第六次采样之间发生另一次收集。此次收集发现幸存者很少,并将终身阈值恢复为31。

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

为每个样本包含时间戳

此示例附加到lvmid 21891,并以250毫秒间隔进行3次采样。使用-t选项为每个样本生成时间戳,并在第一列中显示。

时间戳列报告自目标JVM启动以来经过的时间(秒)。此外,-gcoldcapacity输出显示老年代容量(OGC)和老年代空间容量(OC)随着堆扩展以满足分配或提升需求而增加。第81次完整垃圾收集(FGC)后,老年代容量(OGC)从11696 KB增长到13820 KB。代(和空间)的最大容量为60544 KB(OGCMX),因此仍有扩展空间。

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的仪器

此示例使用-gcutil选项附加到名为remote.domain的系统上的lvmid 40496,每秒采取一次样本,持续进行。

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

jstat -gcutil 40496@remote.domain 1000
... 输出已省略