讲解JVM的性能检测⼯具,主要是⼀些图形化的⼯具。
这篇⽂章是结合上⼀篇⽂章《【JVM系列4】JVM常⽤命令》来讲的,上⼀篇⽂章讲的是JVM⼀些常⽤的命令,但是 通过命令的⽅式查看JVM的指标⾮常费劲,还是图形化⼯具⾹,如果在跟进线上机器的JVM问题时,可能还是离不 开JVM命令。
一:图形化⼯具
1.1 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图像化⼯具,看如何连接上线上机器。
3.1 通过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 &
3.2 配置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
3.3 远程机器视图
挂载远程机器:
配置端口:
界面输出:
这个⽅式其实是按照⽹上的教程操作的,我操作的是公司远程测试环境的机器,但是我操作过程中,其实没 有⾛“配置端⼝”这⼀步,也就是只操作了“通过jstatd启动RMI”,就可以通过该⼯具显示JVM视图,感觉和⽹上 说的不⼀样。
但是我操作线上机器时,这个JVM视图还是出不来,我理解如下:
- 测试环境之所以能展示JVM视图,是因为它⾛的HTTP,所以⽆需再配置JAVA_OPTS的jmxremote参数。
- 线上机器是HTTPS,是需要⾛“配置JMX管理Tomcat”,也就是在JAVA_OPTS中配置jmxremote的参数信息
- 配置JAVA_OPTS不⼀定⾮要按照⽹上说的教程来,你也可以把JAVA_OPTS通过其它⽅式进⾏配置,⽐如我是通过⾃带的Docker容器进⾏配置;