讲解JVM的性能检测工具,主要是一些图形化的工具。
前言
这篇文章是结合上一篇文章《【JVM系列4】JVM常用命令》来讲的,上一篇文章讲的是JVM一些常用的命令,但是通过命令的方式查看JVM的指标非常费劲,还是图形化工具香,如果在跟进线上机器的JVM问题时,可能还是离不开JVM命令。
图形化工具
jconsole
Jconsole(Java Monitoring and Management Console)是从java5开始,在JDK中自带的java监控和管理控制台,用于对JVM中内存,线程和类等的监控,是一个基于JMX(java management extensions)的GUI性能监测工具。jconsole使用jvm的扩展机制获取并展示虚拟机中运行的应用程序的性能和资源消耗等信息。
JConsole程序位于%JAVA_HOME%bin目录下,直接通过命令启动:
JConsole
概览:包括堆内存使用情况、线程、类、CPU使用情况四项信息的曲线图。
内存:主要展示了内存的使用情况,同时可以查看堆和非堆内存的变化值对比。
线程:相当于可视化的jstack命令,同时也可以点击“检测死锁”来检查线程之间是否有死锁的情况。
VM概要:展示JVM所有信息总览,包括基本信息、线程相关、堆相关、操作系统、VM参数等。
其实我主要是想用这个工具检测线上机器,后面我再把线上机器的监控倒腾一下。
VisualVM
VisualVM(All-in-One Java Troubleshooting Tool)是功能最强大的运行监视和故障处理程序之一,曾经在很长一段时间内是Oracle官方主力发展的虚拟机故障处理工具。
相比一些第三方工具,VisualVM有一个很大的优点:不需要被监视的程序基于特殊Agent去运行,因此它的通用性很强,对应用程序实际性能的影响也较小,使得它可以直接应用在生产环境中。
VisualVM程序位于%JAVA_HOME%bin目录下,直接通过命令启动:
jvisualvm
可以安装插件,点击工具->插件:
Visual GC 是常常使用的一个功能,需要通过插件按照,可以明显的看到年轻代、老年代的内存变化,以及gc频率、gc的时间等,感觉这个插件很酷!
监控的主页其实也就是,cpu、内存、类、线程的图表,这里面可以执行堆dump。
线程和jconsole功能没有太大的区别。
最后就是堆dump:
和jconsole比起来,VisualVM用起来更方便,因为jconsole的功能,VisualVM基本都包含,然后VisualVM还可以分析dump文件,然后还有很多可选的插件,真香!
第三方工具
以上三个都是JDK自带的性能监控工具,除此之外还有一些第三方的性能监控工具。
- MAT:Java 堆内存分析工具。
- GChisto:GC 日志分析工具。
- GCViewer:GC 日志分析工具。
- JProfiler:商用的性能分析利器。
- arthas:阿里开源诊断工具。
- async:Java 应用性能分析工具,开源、火焰图、跨平台。
远程机器配置JVM可视化视图
前面的示例都是在本地测试,这里我主要通过VisualVM图像化工具,看如何连接上线上机器。
通过jstatd启动RMI
先登录线上机器,执行"echo $JAVA_HOME"查看目录,然后进入该目录的bin目录下面:
在该目录下新建文件jstatd.all.policy,然后将下面的代码copy到该文件中:
grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; };
执行:
./jstatd -J-Djava.security.policy=jstatd.all.policy &
配置JMX管理Tomcat
先进入Tomcat的bin目录下面,然后打开catalina.sh文件,会发现这个文件前面都是一堆注释,注意!!!就在这一堆注释后面加上一行代码(其实也可以说,就在这个文件的第一行加上一行代码):
JAVA_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
下来说说上面几个参数的意义:
-Dcom.sun.management.jmxremote :允许使用JMX远程管理 -Dcom.sun.management.jmxremote.port=9999 :JMX远程连接端口 -Dcom.sun.management.jmxremote.authenticate=false :不进行身份认证,任何用户都可以连接 -Dcom.sun.management.jmxremote.ssl=false :不使用ssl
远程机器视图
挂载远程机器:
配置端口:
界面输出:
这个方式其实是按照网上的教程操作的,我操作的是公司远程测试环境的机器,但是我操作过程中,其实没有走“配置端口”这一步,也就是只操作了“通过jstatd启动RMI”,就可以通过该工具显示JVM视图,感觉和网上说的不一样。
但是我操作线上机器时,这个JVM视图还是出不来,我理解如下:
- 测试环境之所以能展示JVM视图,是因为它走的HTTP,所以无需再配置JAVA_OPTS的jmxremote参数;
- 线上机器是HTTPS,是需要走“配置JMX管理Tomcat”,也就是在JAVA_OPTS中配置jmxremote的参数信息。(这里我还没有尝试,因为是线上机器,不敢乱动~~)
- 配置JAVA_OPTS不一定非要按照网上说的教程来,你也可以把JAVA_OPTS通过其它方式进行配置,比如我是通过公司自带的Docker容器进行配置;
因为线上环境不能随便动,所以就没有修改线上环境的JAVA_OPTS配置,对于HTTPS机器JVM图像化展示,可以参考:https://www.cnblogs.com/sunshine-2015/p/5547128.html
后记
倒腾这些JVM可视化工具,倒腾了接近一天,感觉还是挺有意思的,本地和远程测试环境都可以通过VisualVM进行JVM可视化展示,唯一的遗憾是线上环境没有配置出来,所以还是有点不甘心,后续有空的话,我还是想把线上环境的可视化视图给倒腾出来。