虚拟机性能监控、故障处理工具
在《深入理解java虚拟机》的前两张学习过内存分配以及垃圾收集相关的知识后,今天继续学习虚拟机性能监控、故障处理相关的工具。其实前两章中,个人感觉内容很多,介绍的较为全面但不够深入,就比如垃圾收集章节中相关垃圾收集器的介绍,但给我们建立一个系统的、完整的知识体系还是足够了,当我们需要用到某一垃圾收集器调优等时,再继续查找相关资料深入学习不失为更好的方法。而这章中学习的东西偏实践,实用性很强,日常用到的可能性也非常高。
我们在分析某个问题时,往往第一反应是先看日志,日志就是我们分析问题时依据的数据之一,数据还包括环境配置文件、系统配置文件、异常堆栈、jvm运行日志、线程快照(threaddump/javacore文件)、堆转储快照(heapdump/hprof文件)等我们可以获取到的相关信息。然后借助于相关工具我们就可以分析数据,定位并解决问题。那么在分析jvm性能以及故障时又有哪些工具呢?
基础故障处理工具
这些工具其实我们都可以在JAVA_HOME目录下找到(如下图所示)
书中,作者将这些工具进行了大致分类,主要分为三类:商业授权工具、正式支持工具以及实验性工具。其实这些都不重要,我们具体看一下有哪些常用工具:
jps:虚拟机进程状况工具
作用:列出正在运行的虚拟机进程(显示执行主类名、进程的本地虚拟机唯一ID等)。
命令:jps [options] [hostid]
示例:
% jps -l
92999 jdk.jcmd/sun.tools.jps.Jps
606
常用参数选项:
jstat:虚拟机统计信息监视工具:
作用:监视虚拟机各种运行状态信息。
命令: jstat [option vmid [interval][s|ms] [count]],若为本地虚拟机进程,vmid为lvmid,也为pid,若为远程虚拟机进程,则格式为[protocol:][//]lvmid[@hostname[:port]/servername]。interval为查询间隔,count为次数。
示例:
jstat -gc 2764 250 20
表示查询进程2764的垃圾收集状况,共计查询20次,查询间隔为250ms。
常用参数选项:
jinfo:java配置信息工具
作用:实时查看和调整jvm各项参数。
命令:jinfo [option] pid
示例:
常用参数选项:如上图所示。
jmap:java内存映像工具
作用:生成堆转储快照(一般为heapdump或dump文件)。
命令:jmap [option] vmid
示例:
常用参数选项:
jhat:虚拟机堆转储快照分析工具
作用:与jmap搭配使用,分析生成的堆转储快照文件(较为简陋,一般不用)。
命令:jhat filename
示例:
我这个应该是不支持,在java_home下也没有找到jhat命令,如果支持的话,可以通过浏览器输入 localhost:7000 访问分析结果。我使用过的分析工具为MAT。
jstack:java堆栈跟踪工具
作用:生成虚拟机当前时刻的线程快照(一般为threaddump或javacore文件)。
命令:jstack [option] vmid
示例:
常用参数选项:
Note:此外,书中还全面的介绍其它的一些基础工具,如用于程序创建和运行的jar、java等工具。使用详情可通过查询书籍或百度学习。在使用这些工具,基本上都可以通过 -h|--help 来查看相关的参数选项,没有必要硬记这些参数。
可视化故障处理工具
这类工具主要介绍了Jconsole、JHSDB、VisualVM以及JMC这四个,就相当于基础处理工具及其扩展集合而成的可视化工具箱,下面简要介绍这几个工具各自的定位和作用,当我们需要用到时再深入了解不迟。
JHSDB:基于服务性代理的调试工具
定位:一款基于服务性代理(服务性代理,即HotSpot中一组用于映射java虚拟机运行信息的、主要基于java语法实现的api集合)实现的进程外调试工具。
作用:通过一个独立的java虚拟机进程来分析其他虚拟机的内部数据,或从dump出来的转储快照还原它的运行状态细节。一般可以用于调试虚拟机进程或dump出来的内存转储快照。
下面是JHSDB与原基础工具实现相同功能的简要对比:
JConsole:java监视与管理控制台
定位:一款基于JMX(通过Java Management Extensions的Managed Bean对系统进行信息收集和参数动态调整)的可视化监视、管理工具。 作用:通过JMX的MBean对系统进行信息收集和参数动态调整。可查看虚拟机内存监控、线程监控等。
VisualVM:多合一故障处理工具
定位:功能强大的运行监视和故障处理程序。
作用:这个作用就大了,可生成、浏览堆转储快照,分析程序性能,动态日志跟踪等。为啥这么强呢?原因在于这个工具可通过插件扩展,有专门的插件中心,这就不讲武德了。感兴趣可深入了解一下,这玩意应该挺强的。
优点:通用性强,对应用程序实际性能影响小(可应用于生产环境)等。
Java Mission Control:可持续在线的监控工具
定位:可持续在线的监控工具。 作用:通过JFR(HotSpot内建的监控和基于事件的信息搜集框架)可生成记录时间、垃圾收集器、方法采样等飞行记录报告,JMC读取并进行分析。 优点:数据质量比其他工具都高,毕竟收费(个人开发环境可用)。
总结
工具是我们分析、定位并解决问题的途径,并非越复杂、集成功能越多的工具越好,相反,若能找到问题所在,基础命令工具也未尝不可。
参考文献
《深入理解JAVA虚拟机》
该博客仅为初学者自我学习的记录,粗浅之言,如有不对之处,恳请指正。