本文使用的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 | public class Example1 { |
编译后,执行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 | Timestamp NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC |
2、验证2
执行jstat -gcnewcapacity -h 3 -t 22075 1000 5
命令,得到如下所示结果:
1 | Timestamp NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC |
五、其他
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