JVM调优前戏之JDK命令行工具---jstat

在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
2
3
$ jstat -class 45995
Loaded Bytes Unloaded Bytes Time
4761 9160.2 0 0.0 1.61
  • Loaded : 加载class的数量
  • Bytes : class字节大小
  • Unloaded : 未加载class的数量
  • Bytes : 未加载class的字节大小
  • Time : 加载时间

1.3.2 -gc

监视Java堆以及GC的状况

1
2
3
$ jstat -gc 45995
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
56832 57344 0 0 513536 234200 148480 45196 21248 20661 2560 2331 8 0.188 1 0.044 0.232

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
2
3
$ jstat -gccapacity 45995
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
87040.0 1397760.0 628736.0 56832.0 57344.0 513536.0 175104.0 2796544.0 148480.0 148480.0 0.0 1069056.0 21248.0 0.0 1048576.0 2560.0 8 1

下面只列出与-gc命令有差异的项(后续同理)

  • NGCMN : 新生代占用的最小空间
  • NGCMX : 新生代占用的最大空间
  • OGCMN : 老年代占用的最小空间
  • OGCMX : 老年代占用的最大空间
  • MCMN : 元空间占用的最小空间
  • MCMX : 元空间占用的最大空间
  • CCSMN : 压缩类占用的最小空间
  • CCSMX : 压缩类占用的最大空间

1.3.4 -gcutil

同-gc,不过输出的是已使用空间占总空间的百分比

1
2
3
$ jstat -gcutil 45995
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 55.27 30.44 97.24 91.06 8 0.188 1 0.044 0.232

1.3.5 -gcnew/-gcnewcapcacity

监视新生代GC状况/输出最大最小空间

1.3.6 -gcold/-gcoldcapacity

监视老年代GC状况/输出最大最小空间

1.3.7 -compiler

输出JIT编译过的方法数量耗时等

1
2
3
$ jstat -compiler 45995
Compiled Failed Invalid Time FailedType FailedMethod
3795 2 0 12.98 1 org/apache/catalina/loader/WebappClassLoader findResourceInternal
  • Compiled : 编译数量
  • Failed : 编译失败数量
  • Invalid : 无效数量
  • Time : 编译耗时
  • FailedType : 失败类型
  • FailedMethod : 失败方法的全限定名

1.3.8 -printcompilation

输出已被JIT编译的方法

1
2
3
$ jstat -printcompilation 45995
Compiled Size Type Method
3795 382 1 org/apache/catalina/core/ContainerBase$ContainerBackgroundProcessor processChildren
  • Compiled : 最近被JIT编译的方法数量
  • Size : 最近被JIT编译方法的字节码数量
  • Type : 最近被编译的编译类型
  • Method : 方法的去按限定名

1.4 高能tips

jstack里FULL GC的次数其实是暂停次数,一般是实际FULL GC次数X2, 如果是正常的CMS/G1, 则是2次暂停。 但是如果出现了特殊情况导致了1次FULL GC只增加了1次也是可能的。