目录
- 概述
- 环境准备
- 工具介绍
- 远程连接方式
- 开启JMX
- 工具远程连接
- 参考文献
概述
线上环境中,程序越来越慢,一头雾水?遇到程序经常宕机,但找不到原因?排查问题却经常记不住命令? 那是没找到好的方法而已,本文将介绍一下JVM问题排查工具的使用, 工具仅仅是工具,还是需要知道一些JVM知识才可以看懂工具中的参数哟..
转帖请注明原贴地址: https://my.oschina.net/u/2342969/blog/2987769
环境准备
- centos 7
- JDK1.8(6 or 7)
- 可运行java应用
工具介绍
jdk自带的可视化排查工具有jconsole和jvisualvm两个,两款工具各有千秋,下面简单说一下博主对两款工具的选择
- 查看线程死锁问题优先选用的jconsole, why? 因为它有一个检查死锁的按钮可以操作.
- 堆和线程dump选用的jvisualVM,why? 因为它有对应功能的按钮可以点击
- 其他场景均使用的jvisualVM
注意:它们均位于 ${JAVA_HOME}/bin 下面
远程连接方式
由于线上服务器是没有可视化界面的,使用可视化工具是没有任何效果的,基本是本地启动工具,远程监控服务器的jvm。
酱紫就会涉及到如何远程连接jvm,远程连接的方式有两种,jstatd和jmx。本文将只介绍jmx连接方式,因为jstatd连接会有权限问题,有一些功能无法正常使用
开启JMX
现在java应用基本spring boot大一统,下面将介绍一下spring boot应用采用JMX远程监控JVM的方式。
一般spring boot应用启动命令如下(线上肯定需要配一些jvm参数,这里不再赘述):
java -Xms500m -Xmx1024m -jar /opt/spring-boot-test.jar --Dspring.profiles.active=test --Dserver.port=8181
启动jmx的启动方式如下:
java -Xms500m -Xmx1024m -Dcom.sun.management.jmxremote.port=3333 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar /opt/spring-boot-test.jar --Dspring.profiles.active=test --Dserver.port=8181
-Dcom.sun.management.jmxremote.port: jmx远程端口
-Dcom.sun.management.jmxremote.ssl: 是否开启ssl认证
-Dcom.sun.management.jmxremote.authenticate:是否开启ssl认证
本文仅仅简单演示,如需更多安全配置,请查阅参考文献
注意:这样子开启后,仍然会无法连接
远程连接时会报错: 无法使用 service:jmx:rmi:///jndi/rmi://192.168.1.104:3333/jmxrmi 连接到 172.16.0.140:3333
报错原因是:jmx除了远程端口外,还监听了其他端口,通过命令查看其他监听端口
查看应用进程号:
#ps aux|grep spring-boot-test
根据应用进程号,查看监听端口
#netstat -antup|grep <pid>
如图可以看到,除了远程端口3333外,还监听了40639和36677两个端口, 所以需要开放这两个端口,本文使用的centos 7 默认防火墙使用的firewalld,其他防火墙自行查阅资料开启端口
#firewall-cmd --zone=public --add-port=40639/tcp --permanent
#firewall-cmd --zone=public --add-port=36677/tcp --permanent
#firewall-cmd --zone=public --add-port=3333/tcp --permanent
#firewall-cmd --reload
工具远程连接
jconsole远程连接
启动jconsole
#${JAVA_HOME}/bin/jconsole
点击连接,正常连接了就会出现下图,如未正常出现,再详细对比上面步骤
jvisualvm远程连接
启动jvisualvm
#${JAVA_HOME}/bin/jvisualvm
正常启动就会出现上图,下面开始进行远程连接
添加JMX远程连接
进入此页面点击监控就可以看到JVM活动情况,如未出现监控信息,请根据以上步骤依次排查
参考文献
文献来自oracle官网java文档,地址随时可能变化哟
https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/applications\_remote.html
https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/jmx\_connections.html