四、虚拟机性能监控与故障处理工具
JDK命令行工具:
Java开发人员肯定都知道JDK的bin目录中有“java.exe”、“javac.exe”这两个命令行工具,但并非所有程序员都了解过JDK的bin目录之中其他命令行程序的作用。
下面将介绍这些工具的其中一部分,主要包括用于监视虚拟机和故障处理的工具。
这些命令行工具大多数是jdk/lib/tools.jar类库的一层薄包装而已,它们主要的功能代码是在tools类库中实现的。
JDK开发团队选择采用Java代码来实现这些监控工具是有特别用意的:当应用程序部署到生产环境后,无论是直接接触物理服务器还是远程Telnet到服务器上都可能会受到限制。借助tools.jar类库里面的接口,我们可以直接在应用程序中实现功能强大的监控分析功能。
JDK版本、操作系统不同,工具所支持的功能可能会有较大差别。
1. jps:虚拟机进程状况工具
JDK的很多小工具的名字参考了UNIX命令的命名方式,jps除了名字像UNIX的ps命令外,功能也差不多,可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本执行的是地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。
jps命令格式:
jps [option] [hostid]
主要选项:
-q 只输出LVMID,省略主类的名称
-m 输出虚拟机进程启动时传递给主列mian()函数的参数
-l 输出主类的全名,如果进程执行的是Jar包,输出Jar路径
-v 输出虚拟机进程启动时JVM参数
执行样例:
[root@DEV-LOCAL-01 ~]# jps -l
1745 org.apache.catalina.startup.Bootstrap
23612 org.apache.catalina.startup.Bootstrap
32607 org.apache.catalina.startup.Bootstrap
11990 org.apache.catalina.startup.Bootstrap
11414 -- process information unavailable
28066 sun.tools.jps.Jps
......
2.jstat:虚拟机统计信息监视工具
jstat是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
jstat命令格式:
jstat [option vmid [interval[s|ms] [count]] ]
如果是本地虚拟机进程,vmid和lvmid是一致的,如果是远程虚拟机进程,那vmid的格式应该是:
[protocol:][//]lvmid[@hostname[:port]/servername]
参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次。
假设需要每250毫秒查询一次进程2764垃圾收集状态,一共查询20次,那命令应当是:jstat -gc 2764 250 20
option主要分为3类:类装载、垃圾收集、运行期编译状况,这里暂时只介绍垃圾收集相关的参数:
-gc 监视Java堆状况,包括Eden区、两个Survivor、老年代、永久代等的容量、已用空间、GC时间合计等信息。
-gccapacity 监视内容和-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间
-gcutil 监视内容和-gc基本相同,但输出主要关注已使用空间占总空间的百分比
-gccause 与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因
执行样例:
[root@DEV-LOCAL-01 ~]# jstat -gcutil 32277
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 31.25 46.58 85.96 62.99 13081 227.599 2 0.836 228.434
Eden区(E表示Eden区)使用了46.58%的空间;Survivor0是空的,Survivor1使用了31.25%的空间;
老年代(O表示Old)和永久代(P表示Permanent)分别使用了85.96%,62.99%的空间;
程序运行以来共发生Minor GC(YGC表示Young GC)13081次,总耗时(YGCT)227.599秒,发生Full GC(FGC表示Full GC)2次,总耗时(FGCT)0.836秒,所有GC总耗时(GCT)228.434秒。
3.jinfo:Java配置信息工具
jinfo的作用是实时的查看和调整虚拟机各项参数。
使用jps命令的-v参数可以查看虚拟机启动时显示指定的参数列表,但如果想知道未被显示指定的参数默认值,除了去找资料外,就只能使用jinfo的-flag选项进行查找了(JDK1.6及以上还可以使用java -XX:+PrintFlagFinal查看参数默认值)。JDK1.6之后,jinfo加入了运行期修改参数的能力,可以使用-flag [+|-] name或者-flag name=value 修改一部分运行期可写的虚拟机参数值。
jinfo命令格式:
jinfo [option] pid
执行样例:
[root@DEV-LOCAL-01 ~]# jinfo -flag SurvivorRatio 32277
-XX:SurvivorRatio=8
查询SurvivorRatio参数值
4.jmap:Java内存映像工具
jmap命令用于生成堆转储快照(一般称为heapdump或者dump文件)。
还可以查询finalize执行队列、Java堆和永久代的详细信息,如空间使用率、当前用的是哪种收集器等。
jmap命令格式:
jmap [option] vmid
选项:
-dump 生成Java堆转储快照,格式 -dump:[live, ]format=b,file=<filename>,live参数说明是否只dump出存活的对象
-heap 显示Java堆详细信息,如使用哪种回收器、参数配置、分代情况等
-histo 显示堆中对象统计信息,包括类、实例数量、合计容量
......
执行样例:
[root@DEV-LOCAL-01 ~]# jmap -dump:format=b,file=testCachecloud.bin 32277
Dumping heap to /root/testCachecloud.bin ...
Heap dump file created
5.jhat:虚拟机堆转储快照分析工具
略
略
略
JDK的可视化工具
1.JConsole
JDK bin目录下的“jconsole.exe”