背景
之前看过了jps,现在我们来看下jstat。
概要
jstat(Java Virtual Machine statistics monitoring tool),虚拟机统计监控工具。一看就是用于监控的,可以用于服务性能优化。
jstat可以检测多项虚拟机指标
- 类加载器(-class)
实战演示
-class:类加载器相关信息
jstat -class -t -h3 55912 1000 100
- -class,类型参数
- -t,显示时间
- -h3,每n次打印一次title
- 55912,进程id
- 1000(ms),每1000ms打印一次
- 100,共打印多少次(不写的话就是一直打印下去)
参数大多可选,这里不赘述,尝试一下即可。
- timestamp,-t的输出结果
- loaded,已加载的类数量(真多。。很多都是动态代理的)
- bytes,已加载的类总大小
- unloaded,已卸载的类数量(多态代理的情况下,是可以卸载类的)
- bytes,已卸载的类总大小
- time,classLoader操作类的总耗时
-compiler:显示JIT(Just-In-Time Compiler即时编译器)的相关信息
jstat -compiler -t -h3 55912 1000 100
命令解析同-class
- compiled,已编译的类(我们看到,已经编译的类和已经加载的类并不相同,但数量差距不大。 可能是懒加载行为的体现)
- failed,???
- time,耗时
- failedType,???
- failedMethod,???
-gc:与gc先关的堆信息
jstat -gc -t -h3 55912 1000 100
- S01,S1C,S0U,S1U from,to的大小和已用量大小(KB)
- EC,EU eden的大小和已用量
- OC,OU 老边代的大小和已用量
- MC,MU 永久区大小和已用量
- CCSC,CCSU 压缩类空间大小和已用量
- YGC,YGCT: 新生代GC次数和耗时
- FGC,FGCT: Full GC次数和耗时
- GCT GC总耗时
我这个例子的fullgc 和 ygct的耗时差不多,都是2s左右。不过一般情况下fgct会更大。
-gccapacity:统计不同分代的容量信息
jstat -gccapacity -t -h3 55912 1000 100
- NGCMN,分解开来就NG_C_MN(new generation capacity minimum),新生代最小容量
- NGCMX,最大容量
- NGC,当前容量
- S0C,S1C等都同上
- MC,分解为meta cap
- CCS,压缩
- YGC,FGC 数量
-gccause(同于gcutil):查看gc原因以及各个分代的百分信息
jstat -gccapacity -t -h3 55912 1000 100
- S0 :年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
- S1 :年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
- E :年轻代中Eden(伊甸园)已使用的占当前容量百分比
- O :old代已使用的占当前容量百分比
- M :元空间已使用的占当前容量百分比
- CCS: 压缩
- YGC :从应用程序启动到采样时年轻代中gc次数
- YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)
- FGC :从应用程序启动到采样时old代(全gc)gc次数
- FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
- GCT:从应用程序启动到采样时gc用的总时间(s)
- LGCC:最后一次GC原因
- GCC:当前GC原因(No GC 为当前没有执行GC)
-printcompilation:HotSpot编译方法统计。HotSpot compilation method statistics(这个不太理解)
jstat -printcompilation -t -h3 55912 1000 100
自评价
jstat的参数不少,但是核心也就那些信息,新生代、老年代、元空间等信息的gc情况和空间使用情况等。
如果服务器频繁出现gc,需要使用这个命令看相关的信息,估计到时候还得查man去。。。