深入理解Java虚拟机-第4章 虚拟机性能监控与故障处理工具- 高飞网

第4章 虚拟机性能监控与故障处理工具

2016-03-07 14:09:18.0

    给一个系统定位问题,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里说的数据包括:运行日志、异常堆栈、GC日志、线程快照(threaddump/javacore文件)、堆转储快照(heapdump/hprof文件)等。

SUM JDK监控和故障处理工具

名称主要作用
jpsJVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。
jstatJVM Statistics Monitoring Tool,用于收集HotSpot虚拟机各方面的运行参数。
jinfoConfiguration Info for Java,显示虚拟机配置信息
jmapMemory Map for Java,生成虚拟机的内存转储快照(heapdump文件)
jhatJVM Heap Dump Browser,用于分析heapdump文件,它会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果
jstackStack Trace for Java,显示虚拟机的线程快照。

注意:如果需要监控运行于JDK1.5之上的程序,在虚拟机启动时请添加参数“-Dcom.sun.management.jmxremote”开启JMX管理功能,否则由于部分工具都是基于JMX,它们将无法使用,如果监控位于JDK1.6的虚拟机上的程序,那JMX管理是默认开启的,无须再加任何参数。


jps:虚拟机进程状况工具

    jps命令格式:jps [option] [hostid]。

    jps可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,hostid为RMI注册表中注册的主机名。

选项作用
-q只输出LVMID,省略主类的名称
-m输出虚拟机进程启动时传递给主类的main()的参数
-l输出主类的全名,如果进程执行的是jar包,输出jar路径
-v输出虚拟机进程启动时JVM参数

例:

jps -l3023 org.apache.catalina.startup.Bootstrap
jps -lv22876 org.apache.catalina.startup.Bootstrap -Djava.util.logging.config.file=/home/www/data/apache-tomcat-7.0.56/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/home/www/data/apache-tomcat-7.0.56/endorsed -Dcatalina.base=/home/www/data/apache-tomcat-7.0.56 -Dcatalina.home=/home/www/data/apache-tomcat-7.0.56 -Djava.io.tmpdir=/home/www/data/apache-tomcat-7.0.56/temp
jps -lvm22876 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/home/www/data/apache-tomcat-7.0.56/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/home/www/data/apache-tomcat-7.0.56/endorsed -Dcatalina.base=/home/www/data/apache-tomcat-7.0.56 -Dcatalina.home=/home/www/data/apache-tomcat-7.0.56 -Djava.io.tmpdir=/home/www/data/apache-tomcat-7.0.56/temp

参考:http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html

jstat:虚拟机统计信息监视工具

    可以显示本地或者远程虚拟机中类装载、内存、垃圾收集、JIT编译等运行数据,是命令行模式的首选模式。

   jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

    参数interval代表间隔和次数,如果省略这两个参数,说明只查询一次,假设需要每250毫秒查询一次进程2764垃圾收集状况,一共查询20次,命令应为:

    jstat -gc 2764 250 20

选项作用
-class监视类装载、卸载数量、总空间以及类装载所耗费的时间
-gc监视Java堆状况,包括Eden区、两个survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息。
-gccapacity监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大最小空间
-gcutil监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
-gccause与-gcutil功能一样,但会额外输出导致上一次GC产生的原因
-gcnew监视新生代GC状态
-gcnewcapacity监视内存与-gcnew基本相同,输出主要关注使用到的最大、最小空间
-gcold监视老年代GC状况
-gcoldcapacity监视内容与-gcold基本相同,输出主要关注使用到的最大、最小空间
-gcpermcapacity输出永久代使用的最大、最小空间
-compiler输出JIT编译器编译过的方法、耗时等信息
-printcompilation输出已经被编译的方法


jinfo:Java配置信息工具

    jinfo(Configuration Info for Java)的作用是实时地查看和调整虚拟机各项参数。使用jps命令的-v参数可以查看虚拟机启动时显式指定的参数列表,但如果想知道未被显式指定的参数的系统默认值,除了去找资料外,就只能使用j的-falg选项进行查询了(如果只限于JDK1.6以上版本的话,使用java -XX:+PrintFlagsFinal查看参数默认值也是一个很好的选择)。jinfo还可以使用-sysprops选项把虚拟机进程的System.getProperties()的内容打印出来。

选项作用
-flag <name>打印虚拟机参数name的值
-flag [+|-]<name>启用或禁用虚拟机参数name
-flag <name>=<value>设置虚拟机参数name的值为value
-flags打印虚拟机参数
-sysprops打印Java系统变量


jmap:Java内存映像工具

    jmap(Memory Map for Java)命令用于生成堆转储快照。如果不使用命令,要想获取堆转储快照,还有一些比较“暴力”的方法:
    1)使用-XX:+HeapDumpOnOutOfMemory,虚拟机在出现内存溢出异常时打印日志。
    2)使用-XX:+HeapDumpOnCtrlBreak,在按下[Ctrl]+[Break]键让虚拟机生成dump文件。
    3)使用kill -3命令“吓唬”一下虚拟机,也能拿到dump文件。

选项作用
-dump生成Java转储快照。
-finalzerinfo显示在F-Queue中等待finalize方法的对象,只在Links/Solaris平台下有用。
 -heap显示Java堆详细信息,如使用哪种回收器,参数配置,分代情况
-histo显示堆中对象统计信息,如类,实例数量,合计容量
-permstat以ClassLoader为统计口径显示永久代内存状态
-F当虚拟机进程对-dump选项没有响应时,可以使用这个命令,强生生成dump快照。


jhat:虚拟机堆转储快照分析工具

    网页形式


jstack:Java堆栈跟踪信息


Jconsole:Java监视与管理控制台


 VisualVM:多合一故障处理工具