前几篇我 们学习了,JVM里面的运行结构,GC算法,以及各种垃圾收集器的优劣点,那么本篇我们来看下如何使用一些虚拟机性能监控工具,来监控和快速处理故障,当 JVM出现一些故障时,我们通常从如下的几个方面进行着手分析,包括运行日志,异常堆栈,GC日志,线程快照(threaddump/javacore文 件),堆转储快照(heapdump/hprof文件),熟练掌握这些工具,可以帮我们更好更快弄清或解决一些难易解决的复杂问题。
下面看下SUN JDK自带的几款故障定位工具:
序号 | 名称 | 描述 |
1 | jps | JVM Process Status Tool ,显示指定系统内所有的HotSpot虚拟机进程 |
2 | jstat | 用于收集hotspot虚拟机各方面的运行数据 |
3 | jinfo | 显示虚拟机配置信息 |
4 | jmap | 生成虚拟机的内存转储快照 |
5 | jhat | 分析heap文件,它会建立一个http/html服务,让用户可以通过浏览器查看分析结果 |
6 | jstack | 显示虚拟机的线程快照 |
1,jps命令几个参数如下:
-q,只输出LVMID省略主类的名称
-m,输出虚拟机进程启动时,传递给主类的main函数的参数
-l,输出主类的全名,如果进程执行的是jar包,输出jar路径
-v,输出虚拟机启动时的JVM参数
2,jstat,虚拟机统计信息监视工具
命令格式,jstat vmid interval count,如果是远程机器,可以加上机器名和IP地址进行访问。
一个示例: jstat -gc 2764 250 20
选项option代表用户需要查询的虚拟机的信息,主要分为3类:类装载、垃圾回收和运行期的编译情况,具体如下表所示:
Option Function
-class 监视类的装载、卸载数量以及类的装载总空间和耗费时间等
-gc 监视Java堆,包含eden、2个survivor区、old区和永久带区域的容量、已用空间、GC时间合计等信息
-gccapcity 监视内容与-gc相同,但输出主要关注Java区域用到的最大和最小空间
-gcutil 监视内容与-gc相同,但输出主要关注已使用空间占总空间的百分比
-gccause 与-gcutil输出信息相同,额外输出导致上次GC产生的原因
-gcnew 监控新生代的GC情况
-gcnewcapacity 与-gcnew监控信息相同,输出主要关注使用到的最大和最小空间
-gcold 监控老生代的GC情况
-gcoldcapacity 与-gcold监控信息相同,输出主要关注使用到的最大和最小空间
-gcpermcapacity 输出永久带用到的最大和最小空间
-compiler 输出JIT编译器编译过的方法、耗时信息
-printcompilation 输出已经被JIT编译的方法
另外,使用jstat -gcutil 2764,比较常用的监控命令:
- [search@fsedump00yw ~]$ jstat -gcutil 7829
- S0 S1 E O P YGC YGCT FGC FGCT GCT
- 0.02 0.00 100.00 96.31 99.94 6504 53.595 9 12.097 65.692
- [search@fsedump00yw ~]$ jstat -gcutil 7829
- S0 S1 E O P YGC YGCT FGC FGCT GCT
- 0.00 0.09 6.05 96.31 99.94 6505 53.598 9 12.097 65.696
- [search@fsedump00yw
参数介绍:
E代表Eden,新生代区,两个survivor区,S0和S1,,老年代使用O来表示,永久带使用P表示,YGC(Minor GC) FULL FGC, FGCT代表FUCC GC耗时,GCT代表总的GC时间。
3,jinfo:实时查看虚拟机调整的各项参数
用法: jinfo option pid
4,jmap,JAVA内存影像工具
用法:jmap [option ] vmid
Option的信息如下表所示
Option Function
-dump 生成对应的dump信息,用法为-dump:[live,]format=b,file={fileName}
-finalizerinfo 显示在F-Queue中等待的Finalizer方法的对象(只在linux下生效)
-heap 显示堆的详细信息、垃圾回收器信息、参数配置、分代详情等
-histo 显示堆栈中的对象的统计信息,包含类、实例数量和合计容量
-permstat 以ClassLoder为统计口径显示永久带的内存状态
-F 当虚拟机对-dump无响应时可使用这个选项强制生成dump快照
示例:jmap -dump:format=b,file=heap.dump 20445
5,jhat ,虚拟机堆转储快照分析工具
hat是用来分析dump文件的一个微型的HTTP/HTML服务器,它能将生成的dump文件生成在线的HTML文件,让我们可以通过浏览器进 行查阅,然而实际中我们很少使用这个工具,因为一般服务器上设置的堆、栈内存都比较大,生成的dump也比较大,直接用jhat容易造成内存溢出,而是我 们大部分会将对应的文件拷贝下来,通过其他可视化的工具进行分析。启用法如下:
jhat {dump_file}
6,jstack JAVA堆栈跟踪工具:
stack用于JVM当前时刻的线程快照,又称threaddump文件,它是JVM当前每一条线程正在执行的堆栈信息的集合。生成线程快照的主 要目的是为了定位线程出现长时间停顿的原因,如线程死锁、死循环、请求外部时长过长导致线程停顿的原因。通过jstack我们就可以知道哪些进程在后台做 些什么?在等待什么资源等!其运行格式如下:
jstack [option] vmid
相关的option和function如下表所示
Option Function
-F 当正常输出的请求不响应时强制输出线程堆栈
-l 除堆栈信息外,显示关于锁的附加信息
-m 显示native方法的堆栈信息
示例:jstack -l 20445
上面说的都是基于命令行的的JVM指令的一些分析,下面看一下可视化的强大的工具.
1,jconsole,
启动命令:cmd里输入jconsole(配置好JDK环境变量的前提下)
JConsole是一个基于JMX的GUI工具,用于连接正在运行的JVM,不过此JVM需要使用可管理的模式启动,我们可以直接在命令行cmd里面启动,它主要监控内存,类,线程和VM信息,界面如下:
2,jvisualvm工具,
在cmd里输入jvisualvm命令启动。
VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带(java启动时不需要特定参数,监控工具在bin/jvisualvm.exe),能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。
在JDK_HOME/bin(默认是C:\Program Files\Java\jdk1.6.0_13\bin)目录下面,有一个jvisualvm.exe文件,双击打开,从UI上来看,这个软件是基于NetBeans开发的了。
截图如下: