在JVM 分析中,jstat 是一个不可缺少的工具。全称是“Java Virtual Machine statistics monitoring tool”,位于java的bin
目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。
是一款轻量级的jvm工具。
如果配置好JDK 环境后,在命令行中输入jsata
会显示出如下的语法结构。
1
2
3invalid argument count
Usage: jstat -help|-options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
1.参数解析
- -t: 可以在打印的列加上Timestamp列,用于显示系统运行的时间;
- -h: 可以在周期性数据数据的时候,可以在指定输出多少行以后输出一次表头;
- vmid: Virtual Machine ID( 进程的 pid);
- interval: 采样时间间隔,单位为毫秒 (可指定单位,比如1秒:
jstat -gc 1000 1s
); - count: 采样次数,用于指定输出多少次记录(如果指定了 interval 不指定count 则会一直打印下去)。
2.options 参数:
1 | jstat -option |
3.options 参数解析
jstat -class <pid>
<pid> 代表进程id 可通过 jps 查看 比如jps -l
监视类装载、卸载数量、总空间以及耗费的时间- Loaded : 加载class的数量
- Bytes : class字节大小
- Unloaded : 未加载class的数量
- Bytes : 未加载class的字节大小
- Time : 加载时间
示例:
1
2
3jstat -class 5644
Loaded Bytes Unloaded Bytes Time
69059 133660.9 4974 6488.3 735.78jstat -compiler <pid>
输出JIT编译过的方法数量耗时等- Compiled 编译数量
- Failed 编译失败数量
- Invalid 无效数量
- Time 编译耗时
- FailedType 失败类型
- FailedMethod 失败方法的全限定名
示例:
1
2
3jstat -compiler 5644
Compiled Failed Invalid Time FailedType FailedMethod
77919 12 0 698.76 1 com/intellij/psi/impl/JavaClassSupersImpl getSuperClassSubstitutorjstat -gc <pid>
垃圾回收堆的行为统计,常见用用法比如jstat -gc h3 5644 1s
表示意思是:
每隔1s 输出一次进程id为5644 的gc 信息,h3:每隔三行输出一次title
type | 解析 |
---|---|
S0C | survivor0区的总容量 |
S1C | survivor1区的总容量 |
S0U | survivor0区已使用的容量 |
S1U | survivor1区已使用的容量 |
EC | Eden区(新生代)的总容量 |
EU | Eden区的已使用总容量 |
OC | olden去的总容量 |
OU | olden去已使用的容量 |
MC | metaspace(元空间)的总容量 |
MU | metaspace(元空间)已使用的容量 |
CCSC | 压缩类空间的总容量 |
CCSU | 压缩类空间已使用的容量 |
YGC | 从应用程序启动到采样时年轻代中gc次数 |
YGCT | 从应用程序启动到采样时年轻代中gc耗时(s) |
FGC | 从应用程序启动到采样时old代(全gc)gc次数 |
FGCT | 从应用程序启动到采样时old代(全gc)gc所用时间(s) |
GCT | 从应用程序启动到采样时gc用的总时间(s) |
作用效果如下:
1
2
3
4
5
6
7
8
9
10jstat -gc -h3 5644 1s
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
20800.0 20800.0 14749.4 0.0 166720.0 164712.4 416376.0 266881.8 391032.0 361566.7 52148.0 46069.5 1012 15.257 38 7.222 22.478
20800.0 20800.0 0.0 3788.4 166720.0 2843.0 416376.0 266881.8 391032.0 361606.6 52148.0 46078.1 1013 15.264 38 7.222 22.486
20800.0 20800.0 0.0 3788.4 166720.0 7655.8 416376.0 266881.8 391032.0 361606.6 52148.0 46078.1 1013 15.264 38 7.222 22.486
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
20800.0 20800.0 0.0 3788.4 166720.0 12492.6 416376.0 266881.8 391032.0 361606.6 52148.0 46078.1 1013 15.264 38 7.222 22.486
20800.0 20800.0 0.0 3788.4 166720.0 17402.9 416376.0 266881.8 391032.0 361606.6 52148.0 46078.1 1013 15.264 38 7.222 22.486
20800.0 20800.0 0.0 3788.4 166720.0 22221.0 416376.0 266881.8 391032.0 361606.6 52148.0 46078.1 1013 15.264 38 7.222 22.486
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
jstat -gccapacity <pid>
输出显示 新生代、老年代、元空间、压缩类空间的大小容量- NGCMN :新生代最小容量
- NGCMX :新生代最大容量
- NGC :当前新生代容量
- S0C :第一个幸存区大小
- S1C :第二个幸存区的大小
- EC :伊甸园区的大小
- OGCMN :老年代最小容量
- OGCMX :老年代最大容量
- OGC :老年代容量大小
- OC ;当前老年代空间容量大小
- MCMN ;最小元数据容量
- MCMX :最大元数据容量
- MC :当前元数据空间大小
- CCSMN :最小压缩类空间大小
- CCSMX :最大压缩类空间大小
- CCSC :当前压缩类空间大小
- YGC :年轻代gc次数
- FGC :老年代GC次数
示例:
1
2
3jstat -gccapacity 5960
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
43648.0 256000.0 165056.0 16448.0 16448.0 132160.0 87424.0 512000.0 329960.0 329960.0 0.0 1320960.0 313844.0 0.0 1048576.0 42800.0 344 21jstat -gcutil <pid>
输出显示 gc 新生代,老年代、元空间、压缩类空间已使用空间占总空间的百分比- S0 :新生代survior space 0区已使用空间容量占比
- S1 :新生代survior space 1区已使用空间容量占比
- E :新生代已使用空间容量占比
- O :老年代已使用空间容量占比
- M :元空间已使用空间容量占比
- CCS :压缩类空间已使用空间容量占比
- YGC :从应用启动到采样发生Yang GC 次数
- YGCT :从应用启动到采样发生Yang GC 次数耗时
- FGC :从应用启动到采样发生Full GC 次数
- FGCT :从应用启动到采样发生Yang GC 次数耗时
- GCT :从应用启动到采样,发生GC 总耗时
示例:
1 | jstat -gcutil 5960 1s 5 |
分析:
1、从第二行到第三行之间发生了一次新生代的gc,耗时为0.008s,新生代的使用率由100% 下降到 3.62%,其中新生代中的对象没有提升到老生代,而压缩类空间则由88.42% 增加到88.43%。
2、幸存区s0 的使用率由 66.74% 下降到 61.97%
- jstat -gccause <pid>
作用于-gcutil
一样,只是比它多两个统计输出数据,分别是- LGCC :最近垃圾回收原因
- GCC :当前垃圾回收原因
1 | jstat -gccause 5960 |
jstat -gcmetacapacity <pid>
显示对应pid 的元空间的容量信息,相对jstat -gccapacity <pid>
来说,jstat -gcmetacapacity <pid>
只是关注于元空间的容量信息,对应的title 解析可参照上面 jstat -gccapacity中的解析。
示例:1
2
3jstat -gcmetacapacity 5960
MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC FGCT GCT
0.0 1347584.0 343668.0 0.0 1048576.0 46256.0 450 26 3.647 9.224jstat -gcnew <pid>
查看新生代gc情况,相关字段解析上面jstat -gc 已有解析,而其中差异的字段解析如下:- S0U : survivor space 0 utilization
- TT : tenuring threshold 阀值, 用于控制对象在新生代存活的最大次数
- MTT :对象在新生代存活的最大次数
- DSS :desired survivor Size 期望的幸存区大小
1
2
3jstat -gcnew 5960
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
16448.0 16448.0 0.0 1444.8 6 6 8224.0 132160.0 114328.5 457 5.657jstat -gcoldcapacity <pid>
查看老年代空间容量信息- OGC: old generation capacity 老生代空间大小(kb)
- OGCMN:最小OGC
- OGCMX: 最大OGC
- OC: old space capacity
- FGC: Full GC
- OGC: old generation capacity
示例:
1
2
3
4
5jstat -gcoldcapacity -h3 12628 1s
OGCMN OGCMX OGC OC YGC FGC FGCT GCT
87552.0 478208.0 87552.0 87552.0 3 0 0.000 0.012
87552.0 478208.0 87552.0 87552.0 3 0 0.000 0.012
87552.0 478208.0 87552.0 87552.0 3 0 0.000 0.012分析:
采样期间,没有经历gc,老年代容量OGC:87552 kb, 当前老年代空间容量:87552 kb,而老年代最大容量为:478208kb
说明还有上升空间