0%

jstat命令

本文使用的JDK版本为jdk1.7.0_79。

一、常用用法

1
jstat StatOption [-h N] [-t] 进程ID [Interval(s|ms)] [Count]

二、含义与选项

2.1、含义

根据指定的统计指标,对指定的虚拟机进程进行相应统计,并打印统计信息。

2.2、选项

1、“StatOption”
使用“StatOption”指定统计指标。“StatOption”可取值有:“-class,-compiler,-gc,-gccapacity,-gccause,-gcnew,-gcnewcapacity,-gcold,-gcoldcapacity,-gcpermcapacity,-gcutil,-printcompilation”。详细描述见“三、StatOption”。
2、“-h N”
每隔N次统计,打印统计指标名称行。
3、“-t”
额外增加“Timestamp(时间列)”统计指标,该时间表示虚拟机进程开始以来到统计时刻经过的秒数。
4、“Interval(s|ms)”
两次统计之间的时间间隔,单位可以是“s(秒)”或者“ms(毫秒)”,默认为“ms(毫秒)”。
5、“Count”
进行“Count”次统计后退出统计。

三、StatOption

如果不作特别说明,内存以“KB”为单位,耗费时间以“秒”为单位。

3.1、“-class”

类加载器行为统计。
统计指标名称与详细描述见表1。

表1

统计指标名称 详细描述
Loaded 被加载类的数量
Bytes 被加载字节数量,以“KB”为单位
Unloaded 被卸载类的数量
Bytes 被卸载字节数量,以“KB”为单位
Time 加载和卸载类行为耗费时间

3.2、“-compiler”

“HotSpot Just-In-Time”编译器行为统计。
统计指标名称与详细描述见表2。

表2

统计指标名称 详细描述
Compiled 成功编译任务数量
Failed 失败编译任务数量
Invalid 无效编译任务数量
Time 编译任务耗费时间
FailedType 最近一次失败编译任务对应的编译类型
FailedMethod 最近一次失败编译任务对应的类名和方法名

3.3、“-gc”

Java堆垃圾回收行为统计。
统计指标名称与详细描述见表3。

表3

统计指标名称 详细描述
S0C 当前Survivor区0内存容量
S1C 当前Survivor区1内存容量
S0U Survivor区0使用内存
S1U Survivor区1使用内存
EC 当前Eden区内存容量
EU Eden区使用内存
OC 当前老年代内存容量
OU 老年代使用内存
PC 当前永久代内存容量
PU 永久代使用内存
YGC 年轻代GC事件数量
YGCT 年轻代GC耗费时间
FGC Full GC事件数量
FGCT Full GC耗费时间
GCT GC耗费总时间

3.4、“-gccapacity”

几个区域(年轻代,Survivor区,Eden区,老年代,永久代)内存容量统计。
统计指标名称与详细描述见表4。

表4

统计指标名称 详细描述
NGCMN 年轻代最小内存容量
NGCMX 年轻代最大内存容量
NGC 当前年轻代内存容量
S0C 当前Survivor区0内存容量
S1C 当前Survivor区1内存容量
EC 当前Eden区内存容量
OGCMN 老年代最小内存容量
OGCMX 老年代最大内存容量
OGC 当前老年代内存容量
OC 当前老年代内存容量,跟“OGC”一致
PGCMN 永久代最小内存容量
PGCMX 永久代最大内存容量
PGC 当前永久代内存容量
PC 当前永久代内存容量,跟“PGC”一致
YGC 年轻代GC事件数量
FGC Full GC事件数量

3.5、“-gcnew”

年轻代行为统计。
统计指标名称与详细描述见表5。

表5

统计指标名称 详细描述
S0C 当前Survivor区0内存容量
S1C 当前Survivor区1内存容量
S0U Survivor区0使用内存
S1U Survivor区1使用内存
TT 根据“-XX:MaxTenuringThreshold”参数值和一系列行为动态调整得到的“Tenuring threshold”值,最终根据该值,年轻代中长期存活的对象进入老年代
MTT “-XX:MaxTenuringThreshold”参数值
DSS DSS=SURVIVOR_SPACE*TargetSurvivorRatio/100,“TargetSurvivorRatio”参数值通过“-XX:TargetSurvivorRatio”形式设定
EC 当前Eden区内存容量
EU Eden区使用内存
YGC 年轻代GC事件数量
YGCT 年轻代GC耗费时间

3.6、“-gcnewcapacity”

年轻代内存容量统计。
统计指标名称与详细描述见表6。

表6

统计指标名称 详细描述
NGCMN 年轻代最小内存容量
NGCMX 年轻代最大内存容量
NGC 当前年轻代内存容量
S0CMX Survivor区0最大内存容量
S0C 当前Survivor区0内存容量
S1CMX Survivor区1最大内存容量
S1C 当前Survivor区1内存容量
ECMX Eden区最大内存容量
EC 当前Eden区内存容量
YGC 年轻代GC事件数量
FGC Full GC事件数量

3.7、“-gcold”

老年代和永久代行为统计。
统计指标名称与详细描述见表7。

表7

统计指标名称 详细描述
PC 当前永久代内存容量
PU 永久代使用内存
OC 当前老年代内存容量
OU 老年代使用内存
YGC 年轻代GC事件数量
FGC Full GC事件数量
FGCT Full GC耗费时间
GCT GC耗费总时间

3.8、“-gcoldcapacity”

老年代内存容量统计。
统计指标名称与详细描述见表8。

表8

统计指标名称 详细描述
OGCMN 老年代最小内存容量
OGCMX 老年代最大内存容量
OGC 当前老年代内存容量
OC 当前老年代内存容量,跟“OGC”一致
YGC 年轻代GC事件数量
FGC Full GC事件数量
FGCT Full GC耗费时间
GCT GC耗费总时间

3.9、“-gcpermcapacity”

永久代内存容量统计。
统计指标名称与详细描述见表9。

表9

统计指标名称 详细描述
PGCMN 永久代最小内存容量
PGCMX 永久代最大内存容量
PGC 当前永久代内存容量
PC 当前永久代内存容量,跟“PGC”一致
YGC 年轻代GC事件数量
FGC Full GC事件数量
FGCT Full GC耗费时间
GCT GC耗费总时间

3.10、“-gcutil”

Java堆垃圾回收行为统计,注意跟“3.3、‘-gc’”小节进行类比。
统计指标名称与详细描述见表10。

表10

统计指标名称 详细描述
S0 Survivor区0使用内存百分比
S1 Survivor区1使用内存百分比
E Eden区使用内存百分比
O 老年代使用内存百分比
P 永久代使用内存百分比
YGC 年轻代GC事件数量
YGCT 年轻代GC耗费时间
FGC Full GC事件数量
FGCT Full GC耗费时间
GCT GC耗费总时间

3.11、“-gccause”

除了“LGCC”和“GCC”两个统计指标外,跟“3.10、‘-gcutil’”小节一致。
上述额外的两个统计指标名称与详细描述见表11。

表11

统计指标名称 详细描述
LGCC 最近一次GC原因,比如“Allocation Failure”
GCC 当前GC原因,比如“Allocation Failure”

3.12、“-printcompilation”

HotSpot方法编译行为统计。
统计指标名称与详细描述见表12。

表12

统计指标名称 详细描述
Compiled 由最近一次编译方法触发的成功编译任务数量
Size 最近一次编译方法的字节码字节大小
Type 最近一次编译任务对应的编译类型
Method 指代最近一次编译方法对应的的类名和方法名

四、举例说明

4.1、理论值

有如下代码:

1
2
3
4
5
6
7
public class Example1 {
public static void main(String[] args) throws InterruptedException {
System.out.println("start");
Thread.sleep(10 * 60 * 1000);
System.out.println("end");
}
}

编译后,执行java -Xms100M -Xmx1000M -XX:NewSize=20M -XX:MaxNewSize=400M -XX:SurvivorRatio=8 -XX:PermSize=20M -XX:MaxPermSize=100M Example1命令,根据这些虚拟机参数的含义,上面提及到的一些统计指标与相应值可描述如表13。

表13

统计指标名称 相应值 说明
NGCMN 20*1024=20480 由“-XX:NewSize=20M”参数直接指定
NGCMX 400*1024=409600 由“-XX:MaxNewSize=400M”参数直接指定
OGCMN (100-20)*1024=81920 作者并不清楚:此种情形下,计算老年代最小内存容量的详细公式,最好参见JDK源代码
OGCMX (1000-400)*1024=614400 作者并不清楚:此种情形下,计算老年代最大内存容量的详细公式,最好参见JDK源代码
S0CMX 400*1/(8+1+1)*1024=40960 根据“-XX:MaxNewSize=400M”和“-XX:SurvivorRatio=8”参数直接计算可得
S1CMX 400*1/(8+1+1)*1024=40960 根据“-XX:MaxNewSize=400M”和“-XX:SurvivorRatio=8”参数直接计算可得
ECMX 400*8/(8+1+1)*1024=327680 根据“-XX:MaxNewSize=400M”和“-XX:SurvivorRatio=8”参数直接计算可得
PGCMN 20*1024=20480 由“-XX:PermSize=20M”参数直接指定
PGCMX 100*1024=102400 由“-XX:MaxPermSize=100M”参数直接指定

4.2、验证值

假设上一小节中的虚拟机进程ID为“22075”,接下来作几个验证。
1、验证1
执行jstat -gccapacity -h 3 -t 22075 1000 5命令,得到如下所示结果:

1
2
3
4
5
6
7
Timestamp        NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC      PGCMN    PGCMX     PGC       PC     YGC    FGC 
33.0 20480.0 409600.0 20480.0 2048.0 2048.0 16384.0 81920.0 614400.0 81920.0 81920.0 20480.0 102400.0 20480.0 20480.0 0 0
34.0 20480.0 409600.0 20480.0 2048.0 2048.0 16384.0 81920.0 614400.0 81920.0 81920.0 20480.0 102400.0 20480.0 20480.0 0 0
35.0 20480.0 409600.0 20480.0 2048.0 2048.0 16384.0 81920.0 614400.0 81920.0 81920.0 20480.0 102400.0 20480.0 20480.0 0 0
Timestamp NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC
36.0 20480.0 409600.0 20480.0 2048.0 2048.0 16384.0 81920.0 614400.0 81920.0 81920.0 20480.0 102400.0 20480.0 20480.0 0 0
37.0 20480.0 409600.0 20480.0 2048.0 2048.0 16384.0 81920.0 614400.0 81920.0 81920.0 20480.0 102400.0 20480.0 20480.0 0 0

2、验证2
执行jstat -gcnewcapacity -h 3 -t 22075 1000 5命令,得到如下所示结果:

1
2
3
4
5
6
7
Timestamp         NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC 
148.5 20480.0 409600.0 20480.0 40960.0 2048.0 40960.0 2048.0 327680.0 16384.0 0 0
149.5 20480.0 409600.0 20480.0 40960.0 2048.0 40960.0 2048.0 327680.0 16384.0 0 0
150.5 20480.0 409600.0 20480.0 40960.0 2048.0 40960.0 2048.0 327680.0 16384.0 0 0
Timestamp NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC
151.5 20480.0 409600.0 20480.0 40960.0 2048.0 40960.0 2048.0 327680.0 16384.0 0 0
152.5 20480.0 409600.0 20480.0 40960.0 2048.0 40960.0 2048.0 327680.0 16384.0 0 0

五、其他

5.1、-Xmx=NGCMX+OGCMX

当未显式设置“-Xmx”值时,可通过“NGCMX+OGCMX”获知实际的“-Xmx”值。


参考文献: [1]http://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html [2]man jstat [3]http://stackoverflow.com/questions/11253285/jstat-difference-between-ogc-oc-pgc-pc [4]http://stackoverflow.com/questions/25887715/java-gc-how-is-desired-survivor-size-calculated [5]http://eyesmore.iteye.com/blog/1530996
您的支持将鼓励我继续分享!