JVM性能监控与故障处理工具
Posted 占用我名字
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM性能监控与故障处理工具相关的知识,希望对你有一定的参考价值。
本文章主要是是对JVM的一些监控工具进行整理。
1、JDK的命令行工具
JDK的监控工具主要有以下几个。
名称 | 主要作用 |
jps | JVM Process Status Tool 查找系统中所有的虚拟机进程 |
jstat | JVM Statistics Monitoring Tool 手机虚拟机各方面的运行数据,统计类装载,垃圾收集次数、各个代的使用状况等 |
jinfo | Configuration Info for Java 查看虚拟机的配置信息 |
jmap | Memory Map for java 生成虚拟机的内存转储快照。 |
jhat | JVM Heap Dump Browser用于分析heapdump文件。他会建立一个HTTP/html服务器,让用户在浏览器上查看分析结果。jmap是生产队快照文件 |
jstack | Stack Trace for Java 显示虚拟机的线程快照 |
接下来一个一个命令进行分析:
1、jps
jps 主要用来查看运行的虚拟机的进程。很简单的一个命令。这里就不再细讲。
使用方法如下:
jps [options] [hostid]
选项 | 主要作用 |
-q | 只输出LVMID(本地虚拟机ID,也就是进程ID),省略主类的名称 |
-m | 输入虚拟机启动时传给main()的参数 |
-l | 输出主类的全名,如果进程执行时的jar包,输出jar包路径,也就是包名 |
-v | 输出虚拟机启动时的参数,也就是手动设置的System.properties。 如 java -Da=10 Demo(Demo为类名) |
2、jstat
jstat可以查看虚拟机的类装载,各个代的内存使用情况,垃圾收集,JIT编译等运行数据。
使用方法如下:
jstat [option vmid [interval[s|ms]] [count]]
其中interval是每隔多少秒或毫秒查询一次,count为一共查询多少次。
选项 | 主要作用 |
-class | 查看类装载、卸载数量、装载和卸载的类的大小以及类装载所消耗的时间。 |
-gc | 查看Java堆内存情况,各个代的容量,已用空间,GC时间等 |
-gccapacity | 和-gc类似,增加了各个堆的最大最小空间 |
-gcutil | 和-gc类似,关注的是各个堆已占用的百分比 |
-gccause | 和-gcutil类似,增加了导致上一次gc的原因 |
-gcnew | 新生代的使用状况 |
-gcnewcapacity | 和-gcnew一致,关注的是最大和最小空间 |
-gcold | 老年代的使用情况 |
-gcoldcapacity | 和-gcold一致,关注的是最大和最小空间 |
-gcpermcapacity | 永久带使用的空间大小 |
-compiler | 查看经过JIT编译器编译过的方法,耗时等信息 |
jstat -class pid
显示列名 | 具体描述 |
Loaded | 装载的类的数量 |
Bytes | 装载类所占用的字节数(KB) |
Unloaded | 卸载类的数量 |
Bytes | 卸载类的字节数 |
Time | 装载和卸载类所花费的 |
上面列名的具体描述是从别人的博客复制过来的,对其中的一些描述我会进行详细说明。
jstat -gc pid
显示列名 | 具体描述 |
S0C | 年轻代中第一个survivor(幸存区)的容量 (字节) |
S1C | 年轻代中第二个survivor(幸存区)的容量 (字节) |
S0U | 年轻代中第一个survivor(幸存区)目前已使用空间 (字节) |
S1U | 年轻代中第二个survivor(幸存区)目前已使用空间 (字节) |
EC | 年轻代中Eden(伊甸园)的容量 (字节) |
EU | 年轻代中Eden(伊甸园)目前已使用空间 (字节) |
OC | Old代的容量 (字节) |
OU | Old代目前已使用空间 (字节) |
PC | Perm(持久代)的容量 (字节) |
PU | Perm(持久代)目前已使用空间 (字节) |
YGC | 从应用程序启动到采样时年轻代中gc次数 |
YGCT | 从应用程序启动到采样时年轻代中gc所用时间(s) |
FGC | 从应用程序启动到采样时old代(全gc)gc次数 |
FGCT | 从应用程序启动到采样时old代(全gc)gc所用时间(s) |
GCT | 从应用程序启动到采样时gc用的总时间(s) |
jstat -gccapacity pid
显示列名 | 具体描述 |
NGCMN | 年轻代(young)中初始化(最小)的大小(字节) |
NGCMX | 年轻代(young)的最大容量 (字节) |
NGC | 年轻代(young)中当前的容量 (字节) |
S0C | 年轻代中第一个survivor(幸存区)的容量 (字节) |
S1C | 年轻代中第二个survivor(幸存区)的容量 (字节) |
EC | 年轻代中Eden(伊甸园)的容量 (字节) |
OGCMN | old代中初始化(最小)的大小 (字节) |
OGCMX | old代的最大容量(字节) |
OGC | old代当前新生成的容量 (字节)(和OC一致) |
OC | Old代的容量 (字节) |
PGCMN | perm代中初始化(最小)的大小 (字节) |
PGCMX | perm代的最大容量 (字节) |
PGC | perm代当前新生成的容量 (字节) |
PC | Perm(持久代)的容量 (字节) |
YGC | 从应用程序启动到采样时年轻代中gc次数 |
FGC | 从应用程序启动到采样时old代(全gc)gc次数 |
jstat -gcutil pid
显示列名 | 具体描述 |
S0 | 年轻代中第一个survivor(幸存区)已使用的占当前容量百分比 |
S1 | 年轻代中第二个survivor(幸存区)已使用的占当前容量百分比 |
E | 年轻代中Eden(伊甸园)已使用的占当前容量百分比 |
O | old代已使用的占当前容量百分比 |
P | perm代已使用的占当前容量百分比 |
YGC | 从应用程序启动到采样时年轻代中gc次数 |
YGCT | 从应用程序启动到采样时年轻代中gc所用时间(s) |
FGC | 从应用程序启动到采样时old代(全gc)gc次数 |
FGCT | 从应用程序启动到采样时old代(全gc)gc所用时间(s) |
GCT | 从应用程序启动到采样时gc用的总时间(s) |
jstat -gcold pid
字段在前面都已详细说明,这里就不再重复
jstat -gcnew pid
MTT:这个字段是设置的是新生代中长期存在的对象进入到老年代的年龄,也就是通过-XX:MaxTenuringThreshold = 15这个参数,默认为15。
因为虚拟机并不是永远的要求对象年龄必须达到上面设置的数的时候才进入老年代,如果在Survivor空间中相同年龄所有对象的大小大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,所以DSS一般都是Survivor的一般,也就是SOC显示容量的一半。而TT则就显示这个年龄的大小,他总是小于等于15.
jstat -gcnewcapacity pid
jstat -compiler pid
显示列名 | 具体描述 |
Compiled | 编译任务执行数量 |
Failed | 编译任务执行失败数量 |
Invalid | 编译任务执行失效数量 |
Time | 编译任务消耗时间 |
FailedType | 最后一个编译失败任务的类型 |
FailedMethod | 最后一个编译失败任务所在的类及方法 |
3、jinfo
jinfo的作用是实时的查看和调整虚拟机的各项参数,同时也可以查看System.properties的参数。
jinfo的命令格式:
jinfo [ option ] <pid>
选项 | 主要作用 |
-flag<name> | 显示虚拟机参数(name)的值。 |
-flag[+|-]<name> | 动态的开启或关闭虚拟机中名字为name的参数 |
-flag<name>=<value> | 动态的更改name的值。 |
-flags | 显示虚拟的参数 |
-sysprops | 显示system properties |
运行的java命令
java -Xms20M -Xmx20M -Xmn10M -Da=10-XX:+PrintGCDetails -XX:MaxTernuringThreshold=10 Demo |
[root@localhost ~]# jinfo 10480 Attaching to process ID 10480, please wait... Debugger attached successfully. Server compiler detected. JVM version is 24.79-b02 Java System Properties:
java.runtime.name = Java(TM) SE Runtime Environment java.vm.version = 24.79-b02 sun.boot.library.path = /usr/java/jdk1.7.0_79/jre/lib/i386 java.vendor.url = http://java.oracle.com/ java.vm.vendor = Oracle Corporation path.separator = : file.encoding.pkg = sun.io java.vm.name = Java HotSpot(TM) Server VM sun.os.patch.level = unknown sun.java.launcher = SUN_STANDARD user.country = US user.dir = /root ............. a = 10 // 增加System.properitiey的方法就是通过-D的方式来添加
VM Flags:
-Xmx256M -Xms32M -Xms20M -Xmx20M -Xmn10M -Da=10
|
以上是关于JVM性能监控与故障处理工具的主要内容,如果未能解决你的问题,请参考以下文章