jstat,是Java虚拟机的统计监测工具,主要用于显示JVM的性能统计。
用法摘要
jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]
generalOption,单个常规的命令行选项(-help,-options,或-version)。
outputOptions,一个或多个输出选项,由一个statOption加上任意的-t,-h和-J选项。
vmid,虚拟机标识符,一个表示目标JVM的字符串。
常规语法是:
[protocol:][//]lvmid[@hostname[:port]/servername]
vmid字符串的语法与URI的语法基本保持一致。vmid可以是一个代表本地JVM的简单整数,也可以是一个指定了通讯协议、端口号以及其他特定实现的值的复杂结构。
interval[s|ms],指定单位(秒/s或毫秒/ms)的采样时间间隔,必须是一个正整数。默认单位为毫秒。如果指定了该选项参数,每过指定的间隔时间,jstat就会产生一次输出。
count,显示的样本数,必须是一个正整数。默认值为无限大。
描述
jstat工具用于显示一个HotSpot Java虚拟机(JVM)的性能统计信息。通过下面描述的虚拟机标识符或vmid选项来标识目标JVM。
虚拟机标识符
vmid字符串的语法与URI的语法基本保持一致:
[protocol:][//]lvmid[@hostname][:port][/servername]
protocol通讯协议。如果protocol被省略并且未指定主机名,则默认协议是一个特定于平台的优化的本地协议。如果protocol被省略并指定了主机名,则默认协议为rmi。lvmid目标JVM的本地虚拟机标识符。lvmid是一个特定平台的值,并在系统上唯一地标识一个JVM。lvmid是虚拟机标识符唯一的必需组件。lvmid通常是(但并不一定是)目标JVM进程在该操作系统上的进程标识符。你可以使用jps命令来确定lvmid。另外,在Unix平台上你可以使用ps命令来确定lvmid,在Windows平台上,你可以使用Windows任务管理器来确定lvmid。hostname表示目标主机的主机名或IP地址。如果hostname被省略,则默认目标主机为本地主机。port与远程服务器通讯的默认端口号。如果hostname被省略,或者protocol指定了一个优化的本地协议,那么port将被忽略。否则,端口参数的处理是一个特定的实现。对于默认的rmi协议来说,port表示远程主机上rmiregistry的端口号。如果port被省略,并且protocol为rmi,那么将使用默认的rmiregistry端口(1099)。servername该参数的处理取决于具体实现。对于优化的本地协议而言,该字段将会忽略。对于rmi协议而言,它代表远程主机上RMI远程对象的名称。
选项
jstat命令支持两种类型的选项,常规选项和输出选项。常规选项使得jstat显示简单的用法和版本信息。输出选项决定统计输出的内容和格式。
注意:所有的选项,以及它们的功能作用可能会在未来的版本中变更或移除。
1,常规选项 statOption
如果指定了一个常规选项,就不能再指定其它的选项或参数。
-help显示帮助信息。
-version显示版本信息。
-options显示统计选项列表。
2,输出选项
如果没有指定常规选项,那么可以指定输出选项。输出选项用于确定jstat输出的内容和格式,它由一个statOption选项,加上任意的其它输出选项(-h,-t,和-J)组成。statOption必须在第一位置。
输出将被格式化为一个表格,其中的列以空白隔开。头部行拥有标题和描述列。使用-h选项来设置表格头的显示频率。不同选项之间的列标题名称通常是一直的。一般情况下,如果两个选项提供了同一名称的列,那么两个列的数据源是相同的。
使用-t选项来显示一个时间戳列,该列将会是输出的第一个列,标题为Timestamp。Timestamp列包含从目标JVM启动开始计算的已过去的时间,单位为秒。时间戳的精确度取决于多种因素,变化主要取决于高负载系统上的线程调度延迟。
分别使用interval和count参数来确定jstat显示输出的频率和次数。
注意:由于在未来版本中输出格式可能变更,因此不建议编写脚本来解析jstat输出。如果选择编写解析jstat输出的脚本,可能需要针对此工具的未来版本修改这些脚本。
-statOption确定jstat显示的统计信息。下表列出了可用的选项。使用常规选项-options可以显示特定平台安装的选项列表。
选项 | 显示 |
class | 类加载器的行为统计 |
compiler | HotSpot即时编译器的行为统计 |
gc | 堆的垃圾回收器的行为统计 |
gccapacity | Java各代区域以及对应空间的容量统计 |
gccause | 垃圾回收的摘要信息(等同于-gcutil), 以及最后的和当前的(如适用)垃圾回收事件的原因。 |
gcnew | new generation的行为统计 |
gcnewcapacity | new generation及其对应空间的大小统计。 |
gcold | old和permanent generation的行为统计。 |
gcoldcapacity | old generation的大小统计。 |
gcpermcapacity | permanent generation的大小统计。 |
gcutil | 垃圾回收统计的摘要信息。 |
printcompilation | HotSpot汇编方法统计。 |
-h n每过n个样例(输出行)就显示一个列头,n为一个正整数。默认值为0,即只在数据的第一行上面显示列头。-t n显示时间戳列,并作为输出的第一个列。该时间戳表示目标JVM启动时间到当前时间的间隔时间。-JjavaOption传递javaOption到java应用启动程序。例如:-J-Xms48m设置启动内存为48MB。
statOption和输出
下列表格概括了jstat为每个statOption输出的列。
-class选项
类加载器的统计信息
列 | 描述 |
Loaded | 加载的类的数量 |
Bytes | 加载的Kbyte数 |
Unloaded | 已卸载的类的数量 |
Bytes | 已卸载的Kbyte数 |
Time | 执行类的加载和卸载操作所耗费的时间 |
-compiler选项
HotSpot即时(Just-In-Time)编译器的统计信息
列 | 描述 |
Compiled | 已执行的编译任务数 |
Failed | 失败的编译任务数 |
Invalid | 无效的编译任务数 |
Time | 执行编译任务所耗费的时间 |
FailedType | 最后失败的编译的编译类型 |
FailedMethod | 最后失败的编译的类名和方法 |
-gc选项
垃圾回收堆的统计信息
列 | 描述 |
S0C | survivor space 0的当前容量(KB). |
S1C | survivor space 1的当前容量(KB). |
S0U | survivor space 0使用的容量(KB). |
S1U | survivor space 1使用的容量(KB). |
EC | Eden space的当前容量(KB). |
EU | Edenspace的已用容量(KB). |
OC | Oldspace的当前容量(KB). |
OU | Old space的已用容量(KB). |
PC | Permanent space的当前容量(KB). |
PU | Permanentspace的已用容量(KB). |
YGC | Younggeneration的GC事件数量 |
YGCT | Younggeneration的垃圾回收事件 |
FGC | Full GC事件的数量 |
FGCT | Full GC的时间 |
GCT | 总计的垃圾回收时间 |
-gccapacity选项
内存池的分代和空间容量Memory Pool Generation and Space Capacities
Column | Description |
NGCMN | newgeneration的最小容量(KB). |
NGCMX | newgeneration的最大容量(KB). |
NGC | newgeneration的当前容量(KB). |
S0C | survivor space 0的当前容量(KB). |
S1C | survivor space 1的当前容量(KB). |
EC | Eden space的当前容量(KB). |
OGCMN | Old generation的最小容量(KB). |
OGCMX | Oldgeneration的最大容量(KB). |
OGC | Oldgeneration的当前容量(KB). |
OC | Old space的当前容量(KB). |
PGCMN | Permanentgeneration的最小容量(KB). |
PGCMX | Permanentgeneration的最大容量(KB). |
PGC | Permanentgeneration的当前容量(KB). |
PC | Permanent space的当前容量(KB). |
YGC | Younggeneration的GC事件数 |
FGC | Full GC事件的数量 |
-gccause选项
此选项显示与-gcutil选项相同的垃圾回收统计摘要信息,但却包括最后的和当前的(如适用)垃圾回收事件的原因。除了-gcutil列出的列,此选项还添加了以下列:
垃圾回收统计,包括GC事件
列 | 描述 |
LGCC | 最后的垃圾回收的原因 |
GCC | 当前的垃圾回收的原因 |
-gcnew选项
新生代(New)的统计信息
列 | 描述 |
S0C | survivor space 0的当前容量(KB). |
S1C | survivor space 1的当前容量(KB). |
S0U | survivor space 0的已用容量(KB). |
S1U | survivor space 1的已用容量(KB). |
TT | 期限阈值 |
MTT | 最大的期限阈值 |
DSS | 所需的幸存者(survivor)大小(KB). |
EC | Eden space的当前容量(KB). |
EU | Eden space的已用容量(KB). |
YGC | Young generation的GC事件数 |
YGCT | Young generation的垃圾回收时间 |
-gcnewcapacity选项
新生代(new)的空间大小统计
列 | 描述 |
NGCMN | new generation的最小容量(KB). |
NGCMX | new generation的最大容量(KB). |
NGC | new generation的当前容量(KB). |
S0CMX | survivor space 0的最大容量(KB). |
S0C | survivor space 0的当前容量(KB). |
S1CMX | survivor space 1的最大容量(KB). |
S1C | survivor space 1的当前容量(KB). |
ECMX | Eden space的最小容量(KB). |
EC | Eden space的当前容量(KB). |
YGC | Young generation的GC事件数 |
FGC | Full GC事件的数量 |
-gcold选项
Old和Permanent Generation的统计信息
列 | 描述 |
PC | permanent space的当前容量(KB). |
PU | Permanent space的已用容量(KB). |
OC | old space的当前容量(KB). |
OU | old space的已用容量(KB). |
YGC | young generation的GC事件数 |
FGC | Full GC事件的数量 |
FGCT | Full GC的时间 |
GCT | 总计的垃圾回收时间 |
-gcoldcapacity选项
Old Generation的统计信息
列 | 描述 |
OGCMN | old generation的最小容量(KB). |
OGCMX | old generation的最大容量(KB). |
OGC | old generation的当前容量(KB). |
OC | old space的当前容量(KB). |
YGC | young generation的GC事件数 |
FGC | Full GC事件的数量 |
FGCT | Full GC的时间 |
GCT | 总计的垃圾回收时间 |
-gcpermcapacity选项
Permanent Generation的统计信息
列 | 描述 |
PGCMN | permanent generation的最小容量(KB). |
PGCMX | permanent generation的最大容量(KB). |
PGC | permanent generation的当前容量(KB). |
PC | permanent space的当前容量(KB). |
YGC | young generation的GC事件数 |
FGC | Full GC 事件的数量 |
FGCT | Full GC的时间 |
GCT | 总计的垃圾回收时间 |
-gcutil选项
垃圾回收统计的摘要信息
列 | 描述 |
S0 | Survivor space 0已用容量占当前容量的百分比 |
S1 | Survivor space 1已用容量占当前容量的百分比 |
E | Eden space已用容量占当前容量的百分比 |
O | Old space已用容量占当前容量的百分比 |
P | Permanent space已用容量占当前容量的百分比 |
YGC | young generation的GC事件数 |
YGCT | Young generation的垃圾回收时间 |
FGC | Full GC事件的数量 |
FGCT | Full GC的时间 |
GCT | 总计的垃圾回收时间 |
-printcompilation选项
HotSpot编译器方法统计
列 | 描述 |
Compiled | 已执行的编译任务数 |
Size | 方法字节码的字节数 |
Type | 编译类型 |
Method | 表示被编译方法的类名和方法名。类名使用"/"替代"."作为命名空间的分隔符。方法名是给定的类的方法。这两个字段的格式与HotSpot选项- XX:+PrintComplation是一致的。 |
示例
本节介绍监控lvmid为1928的本地JVM的几个示例。
使用gcutil选项
本示例附于lvmid 1928,每过250毫秒获取7个样本,并指定-gcutil选项来显示输出。
jstat -gcutil 1928 250 7
S0 S1 E O P YGC YGCT FGC FGCT GCT
12.44 0.00 27.20 9.49 96.70 78 0.176 5 0.495 0.672
12.44 0.00 62.16 9.49 96.70 78 0.176 5 0.495 0.672
12.44 0.00 83.97 9.49 96.70 78 0.176 5 0.495 0.672
0.00 7.74 0.00 9.51 96.70 79 0.177 5 0.495 0.673
0.00 7.74 23.37 9.51 96.70 79 0.177 5 0.495 0.673
0.00 7.74 43.82 9.51 96.70 79 0.177 5 0.495 0.673
0.00 7.74 58.11 9.51 96.71 79 0.177 5 0.495 0.673
该示例的输出表明,第3和第4个样本之间发生了一个young generation的垃圾回收。此次回收耗费0.001秒,并将eden space(E)的对象推进到old space(O),结果使得old space的已用容量从9.49%增加到9.51%。在回收之前,survivor space使用了12.44%,但在回收之后,仅使用了7.74%。
重复列的标题字符串
本示例附于lvmid 1928,每过250毫秒获取一次样本,并指定-gcutil选项来显示输出。此外,它使用-h3选项来实现每显示3行数据之后输出一次列标题。
jstat -gcnew -h3 1928 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
除了显示重复的标题字符串,此示例还显示,在第2和第3个样本之间,发生了一次young GC。它耗费了0.001秒。此次回收发现了足够多的活跃数据,survivor space 0的使用空间(S0U)已经超过所需的survivor大小(DSS)。结果,对象被推进old generation(本次输出中不可见),期限阈值(TT)从31降到2。
第5和第6个样本之间发生了另一次垃圾回收。此次回收只发现了少许的survivor,期限阈值又返回到了31。
每个样本包含一个时间戳
本示例附于lvmid 1928,并且每过250毫秒就提取3个样本。选项-t用来为每个样本在第一列生成一个时间戳。
jstat -gcoldcapacity -t 1928 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
Timestamp列报告了自目标虚拟机启动以后所消逝的时间,单位是秒。此外, 选项-gcoldcapacity显示,为了满足分配或提升的需求,old generation的容量(OGC)和old space的容量(OC)随着堆的扩张而增加。在第81次Full GC(FGC)之后,old generation的容量(OGC)从11696KB增长到13820KB。generation(和space)的最大容量为60544KB(OGCMX),因此它仍然有扩张的空间。
监控远程JVM
本示例附于名为remote.domain的系统的lvmid 13830,使用-gcutil选项,并且无限期地每秒获取一次样本。
jstat -gcutil 13830@remote.domain 1000
...省略输出lvmid与远程主机的名称结合,构成了一个lvmid -- 13830@remote.domain。该vmid导致使用rmi协议来与远程主机的默认jstatd服务器进行通讯。jstatd服务器位于remote.domain之上,并使用绑定默认rmiregistry端口号(1099)的rmiregistry。