本文使用的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