在JDK的命令行中,一般开发人员最耳熟能详的肯定就是java,javac,javap等常用命令,不过在jdk/bin下还有许多其他的命令行工具,它们被用来监测JVM运行时的状态,下面我们来详细解读一下几个常用的工具以及如何使用。
1.jstat
jstat(JVM statistics Monitoring)是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
1.1 命令格式
jstat [option] LVMID [interval] [count]
1.2 参数
- [option] : 操作参数
- LVMID : 本地虚拟机进程ID
- [interval] : 连续输出的时间间隔
- [count] : 连续输出的次数
1.3 示例
主要针对常用的[option]参数
1.3.1 -class
监视类装载、卸载数量、总空间以及耗费的时间
1 | $ jstat -class 45995 |
- Loaded : 加载class的数量
- Bytes : class字节大小
- Unloaded : 未加载class的数量
- Bytes : 未加载class的字节大小
- Time : 加载时间
1.3.2 -gc
监视Java堆以及GC的状况
1 | $ jstat -gc 45995 |
C即Capacity 总容量,U即Used 已使用的容量
- S0C : survivor0区的总容量
- S1C : survivor1区的总容量
- S0U : survivor0区已使用的容量
- S1C : survivor1区已使用的容量
- EC : Eden区的总容量
- EU : Eden区已使用的容量
- OC : Old区的总容量
- OU : Old区已使用的容量
- MC : 元空间(JDK8之前的永久代)的总容量
- MU : 元空间已使用的容量
- CCSC : 压缩类空间总容量
- CCSU : 压缩类空间已使用的容量
- YGC : 新生代垃圾回收次数
- YGCT : 新生代垃圾回收时间
- FGC : 老年代垃圾回收次数
- FGCT : 老年代垃圾回收时间
- GCT : 垃圾回收总消耗时间
1 | $ jstat -gc 45995 2000 20 |
这个命令意思就是每隔2000ms输出45995的gc情况,一共输出20次
1.3.3 -gccapacity
同-gc,不过还会输出Java堆各区域使用到的最大、最小空间
1 | $ jstat -gccapacity 45995 |
下面只列出与-gc命令有差异的项(后续同理)
- NGCMN : 新生代占用的最小空间
- NGCMX : 新生代占用的最大空间
- OGCMN : 老年代占用的最小空间
- OGCMX : 老年代占用的最大空间
- MCMN : 元空间占用的最小空间
- MCMX : 元空间占用的最大空间
- CCSMN : 压缩类占用的最小空间
- CCSMX : 压缩类占用的最大空间
1.3.4 -gcutil
同-gc,不过输出的是已使用空间占总空间的百分比
1 | $ jstat -gcutil 45995 |
1.3.5 -gcnew/-gcnewcapcacity
监视新生代GC状况/输出最大最小空间
1.3.6 -gcold/-gcoldcapacity
监视老年代GC状况/输出最大最小空间
1.3.7 -compiler
输出JIT编译过的方法数量耗时等
1 | $ jstat -compiler 45995 |
- Compiled : 编译数量
- Failed : 编译失败数量
- Invalid : 无效数量
- Time : 编译耗时
- FailedType : 失败类型
- FailedMethod : 失败方法的全限定名
1.3.8 -printcompilation
输出已被JIT编译的方法
1 | $ jstat -printcompilation 45995 |
- Compiled : 最近被JIT编译的方法数量
- Size : 最近被JIT编译方法的字节码数量
- Type : 最近被编译的编译类型
- Method : 方法的去按限定名
1.4 高能tips
jstack里FULL GC的次数其实是暂停次数,一般是实际FULL GC次数X2, 如果是正常的CMS/G1, 则是2次暂停。 但是如果出现了特殊情况导致了1次FULL GC只增加了1次也是可能的。