第四章 虚拟机性能监控与故障处理工具
jps:JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程
jstat:JVM Statistics Monitoring Tool,用于收集HotSpot虚拟机各方面的运行数据
jinfo:Configuration Info for Java,显示虚拟机配置信息
jmap:Memory Map for Java,生成虚拟机的内存转储快照(heap dump文件)
jhat:JVM Heap Dump Browser,用于分析heap dump文件,会建立一个HTTP/HTML服务器,
让用户可以在浏览器查看分析结果
jstack:Stack Trace for Java,显示虚拟机的线程快照
1. jps:虚拟机进程状况工具
命令格式:
jps [options] [hostid]
举个例子:
- 输入
jps -l
后,显示结果为:1956 Chapter_02.TestGC
,前面的1956就是java的pid,后面是主类的名称。 - 输入
jps -v
后,显示结果会在上面基础上列出各个虚拟机启动的JVM参数,这个很有用!!!
说白了,jps会列出当前所有的Java进程。这个命令非常简单,但是很好用。比如你启动了多个tomcat进程,使用jps -l
就可以得到所有tomcat进程的pid。然后再使用下面的命令对相应的tomcat进程进行分析。
2. jstat:虚拟机统计信息监视工具
命令格式:
jstat [options vmid [interval[s ms] [count]] ]
假如我想监控gc,每250ms查询一次,一共查询20次,进程号为1234。命令就是:jstat -gc 1234 250 20
。那么,如果是远程机器又该如何做呢?很简单,使用jstatd。和mysql类似,mysql是客户端,mysqld是服务器端。所以当远程机器开始了jstatd,就相当于开启了远程虚拟机进程的监控,本地可通过RMI查看远程机器的运行时数据,非常方便。
在这里,option主要分为3类:
- 类装载
- 垃圾收集
- 运行期编译状况
具体选项很简单,
比如我们想详细了解一下当前JVM的内存使用情况,就可以使用看下各个内存区域的使用率。
jstat -gcutil 1234(前面统计generation占用,单位为百分比;后面统计次数和时间,单位为s)
3. jinfo:Java配置信息工具
jinfo全称为Configuration Info for Java,它的作用是实时地查看和调整虚拟机的各项参数。
命令格式:
jinfo [ option ] pid
- 查询参数可以使用
jinfo -flag PrintGCDetails 1234
,是时候抛弃上面提到的java -XX:+PrintFlagsFinal | grep PrintGCDetails
了。 - 比较牛逼的是,jinfo可以在运行期修改参数(当然,必须是jvm可以在运行期可写的参数了),比如
jinfo -flag +PrintGCDetails
就可以加上打印GC日志的功能了。
4. jmap:Java内存映像工具
jmap全称为Memory Map for Java,它用于生成堆转储快照(一般称为heap dump或者dump文件)。当然,jmap的作用并不仅仅是为了获取dump文件供其他工具分析当前JVM的内存情况,它还可以查询finalize执行队列,Java堆和永久代的详细信息,如空间使用率、当前用的是哪种收集器等。它的命令格式为:
jmap [ option ] vmid
常用的几个选项我直接列出来吧:
- -dump:生成heap dump文件。格式为jmap -dump:[live,]format=b,file=
,其中live是否只dump存活的对象 - -finalizeinfo:显示在F-Queue中等待finalizer线程执行finalize方法的对象
- -heap:显示java堆的详细信息,比如使用那种回收器、参数配置、分代状况等等
- -histo:显示堆中对象统计信息,包括类、实例数量和合计容量
- -permstat:以ClassLoader为统计口径显示永久代内存状态
比如我得到dump快照,就可以先通过jps拿到虚拟机的LVMID,然后使用jmap -dump:format=b,file=haha.bin <LVMID>
就可以了。这里我在MacOS下,dump出了eclipse的heap dump文件,大小为83M。可以供下面jhat分析使用。
5. jhat:虚拟机堆转储快照分析工具
如果打开后,可以在本地localhost:7000查看结果。拉到最下面有个Heap Histogram,点进去就可以看到虚拟机中所有对象实例的数目和大小。
6. jstack:Java堆栈跟踪工具
Tips:
在JDK 1.5中,java.lang.Thread类新增了一个叫做getAllStackTraces()方法用于获取虚拟机中所有线程的StackTraceElement对象,可以通过这个方法做一个管理员界面,用JSP可以随时查看当前服务的线程堆栈。