准备陆陆续续介绍几款JVM监控工具.
JPS
查找当前用户的Java进程,通常当你不知道服务器上有哪些java进行的时候,直接输入jps或者带命令选项,就能直接查询出来了.
-l:输出完全的包名,应用主类名,jar的完全路径名;
-v:输出jvm参数
JVM启动的时候都是使用jdk来启动,使用系统命令如ps -ef|grep java,这种场景下使用jps确实是鸡肋.但是很多情况下,启动的进程比较多,不会直接使用jdk来启动,而是创建一些比较有语义性的软链,使用这个有语义的软链来启动应用.
${JAVA_HOME}/java xxx.jar
// 变为软链启动
ln -s ${JAVA_HOME}/java my_process_name
./my_process_name xxx.jar
例如上面的方式,使用系统的命令ps -ef|grep java 是查找不出java进行的,此时jps能够准确找到.
jstat
全称是Java Virtual Machine Statistics Monitoring Tool,通常使用他来查看类加载和卸载情况JVM各个分代的容量已经使用容量,GC原因和时间.
Usage: jstat -help|-options
jstat - [-t] [-h] [ []]
// 使用方式
jstat -gcutil 25477 1000 500
jstat -help 可以看到看到命令行的使用方式.上面示例gcutil 就是options,即要使用的功能;25477是进程号,也就是vmid;1000是频率,即1000,每1000ms输出一次监控结果;500为执行次数,即count
这个选项比较多
class
类加载情况的统计
jstat -class 2600
Loaded Bytes Unloaded Bytes Time
400 830.9 0 0.0 0.11
Loaded 加载的类数量.
Bytes 加载类所耗费的空间,单位KB.
Unloaded 卸载的类数控.
Bytes 卸载类释放的空间,单位KB
Time 加载和卸载所花的时间.
compiler
即时编译器编译情况的统计
jstat -compiler 2600
Compiled Failed Invalid Time FailedType FailedMethod
19 0 0 0.01 0
Compiled 编译执行次数
Failed 编译任务失败词素
Invalid 无效编译任务次数
Time 编译任务花费的时间
FailedType 最后一次编译失败的编译类型
FailedMethod 最后一次编译失败的类名及方法名
gc
JVM中堆的垃圾收集情况的统计,主要是当前的容量和GC的情况
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
5120.0 5120.0 0.0 0.0 33280.0 5325.4 87552.0 0.0 4480.0 776.9 384.0 75.8 0 0.000 0 0.000 0.000
S0C 新生代中Survivor space中S0当前容量的大小(KB)
S1C 新生代中Survivor space中S1当前容量的大小(KB)
S0U 新生代中Survivor space中S0容量使用的大小(KB)
S1U 新生代中Survivor space中S1容量使用的大小(KB)
EC Eden space当前容量的大小(KB)
EU Eden space容量使用的大小(KB)
OC Old space当前容量的大小(KB)
OU Old space使用容量的大小(KB)
PC Permanent space当前容量的大小(KB)
PU Permanent space使用容量的大小(KB)
YGC 从应用程序启动到采样时发生 Young GC 的次数
YGCT 从应用程序启动到采样时 Young GC 所用的时间(秒)
FGC 从应用程序启动到采样时发生 Full GC 的次数
FGCT 从应用程序启动到采样时 Full GC 所用的时间(秒)
GCT 从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC
gccause
jstat -gccause 8524 1000 1000
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
0.00 0.00 22.00 0.62 53.34 53.68 392 0.134 0 0.000 0.134 Allocation Failure No GC
0.00 0.00 0.00 0.62 53.34 53.68 418 0.142 0 0.000 0.142 Allocation Failure No GC
LGCC 最后一次垃圾收集原因,上述示例为分配失败
GCC 当前垃圾收集原因
gc其他
其他的gc options 还包括 gccapacity , gccause ,gcnew ,gcnewcapacity ,gcold ,gcoldcapacity,gcpermcapacity ,gcutil 基本上都是gc的分代情况和耗费时间,具体不赘述可以查看手册
https://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html
对于GC实时分析,jstat虽然能够提供一些信息.但是其详细程度还是不够.只能说临时使用一下,比较详细的方式如加JVM选项打印GC log,或者jmap内存分析,抑或VisualVM,后面的文章进行介绍.