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

Sum JDK监控和故障处理工具

  1. jps:JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程
  2. jstat:JVM Statistics Monitoring Tool,用于收集HotSpot虚拟机各方面的运行数据
  3. jinfo:Configuration Info for Java,显示虚拟机配置信息
  4. jmap:Memory Map for Java,生成虚拟机的内存转储快照(heap dump文件)
  5. jhat:JVM Heap Dump Browser,用于分析heap dump文件,会建立一个HTTP/HTML服务器,
  6. 让用户可以在浏览器查看分析结果
  7. jstack:Stack Trace for Java,显示虚拟机的线程快照

1. jps:虚拟机进程状况工具

首先,jps的全称是JVM Process Status Tool,和Unix的ps命令有类似功能:
它可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Claas,main()函数所在的类)的名称,以及这些进程的内地虚拟机的唯一ID(LVMID,Local Virtual Machine Identifier)。

命令格式:

jps [options] [hostid]

    (1)-q : 只输出LVMID,省略主类的名称
    (2)-m :输出虚拟机进程启动时传递给主类main()函数的参数
    (3)-l :输出主类的全名,如果进程执行的是Jar包,输出Jar路径
    (4)-v:输出虚拟机进程启动时JVM参数

举个例子:

  • 输入jps -l后,显示结果为:1956 Chapter_02.TestGC,前面的1956就是java的pid,后面是主类的名称。
  • 输入jps -v后,显示结果会在上面基础上列出各个虚拟机启动的JVM参数,这个很有用!!!

说白了,jps会列出当前所有的Java进程。这个命令非常简单,但是很好用。比如你启动了多个tomcat进程,使用jps -l就可以得到所有tomcat进程的pid。然后再使用下面的命令对相应的tomcat进程进行分析。



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

jstat的全称是JVM Statistics Monitoring Tool,它用于监视虚拟机各种运行状态信息。可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形界面,只提供纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。

命令格式:

jstat [options vmid [interval[sms] [count]] ]

假如我想监控gc,每250ms查询一次,一共查询20次,进程号为1234。命令就是:jstat -gc 1234 250 20。那么,如果是远程机器又该如何做呢?很简单,使用jstatd。和mysql类似,mysql是客户端,mysqld是服务器端。所以当远程机器开始了jstatd,就相当于开启了远程虚拟机进程的监控,本地可通过RMI查看远程机器的运行时数据,非常方便。

在这里,option主要分为3类:

  1. 类装载
  2. 垃圾收集
  3. 运行期编译状况

具体选项很简单,

jstat工具主要选项
    (1)-class : 监视类装载、卸载数量、总空间及类装载所耗费的时间
    (2)-gc : 监视Java堆状况,包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息
    (3)-gccapacity: 监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大和最小空间
    (4)-gcutil : 监视内容与-gc基本相同,但输出主要关注已使用空间栈总空间的百分比
    (5)-gccause:与-gcutil功能已用,但是会额外输出导致上一次GC产生的原因
    (6)-gcnew: 监视新生代GC的状况
    (7)-gcnewcapacity:监视内容与-gcnew基本相同,输出主要关注使用到的最大和最小空间
    (8)-gcold:监视老年代GC的状况
    (9)-gcoldcapacity:监视内容与-gcold基本相同,输出主要关注使用到的最大和最小空间
    (10)-gcpermcapacity:输出永久代使用到的最大和最小空间
    (11)-complier:输出JIT编译器编译过的方法、耗时等信息
    (12)-printcompilation:输出已经被JIT编译的方法。

比如我们想详细了解一下当前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:虚拟机堆转储快照分析工具

    上面我们使用jmap得到了dump快照,而jhat就是分析dump快照的利器。它的全称是JVM Heap Analysis Tool,。jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,可以在浏览器中查看。但一般情况下,这个命令使用的几率不会太大。首先对于线上服务器来说,生成dump快照后,分析快照是一个很耗时且吃硬件的过程,如果dump快照过于复杂,甚至会影响线上服务。记得我在网上看过这个方法,然后在我们线上服务器用jmap生成了heap dump文件,发现dump文件大概有10G。用jhat一分析,服务器瞬间就报警了= =,于是赶紧kill了。。。作者建议是将这个dump快照拷贝到线下,然后使用更强大的GUI工具来直观分析,比如Eclipse Memory Analyzer、IBM HeapAnalyzer等工具。但是对于超过5G的dump,一般是打不开的。。。。。。我已经尝试了好多次了,都打不开。

如果打开后,可以在本地localhost:7000查看结果。拉到最下面有个Heap Histogram,点进去就可以看到虚拟机中所有对象实例的数目和大小。


6. jstack:Java堆栈跟踪工具

    jstack全称为Stack Trace for Java,它用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。线程快照就是当前虚拟机内存每一个线程正在执行的方法堆栈的集合。生成线程快照的主要目的就是定位线程出现长时间停顿的原因,比如线程间死锁、死循环、请求外部资源导致的长时间等待都是导致线程长时间停顿的常见原因。比如上次我们线上的一个HashMap造成的死循环,就是用jstack分析出来的。

Tips:

在JDK 1.5中,java.lang.Thread类新增了一个叫做getAllStackTraces()方法用于获取虚拟机中所有线程的StackTraceElement对象,可以通过这个方法做一个管理员界面,用JSP可以随时查看当前服务的线程堆栈。


7. JDK的可视化工具

    略、详情见书。

这章内容主要是介绍性的,大概让你了解有这些个东西。





















posted @ 2017-04-05 19:18  _如此甚好  阅读(197)  评论(0编辑  收藏  举报