使用 VisualVM 远程连接 JVM

修改 Java 配置

  1. 首先进入 ${JAVA_HOME}/jre/lib/management/ (Java8 之后在 /conf/management) 目录。

  2. 重命名 jmxremote.password.template

cp jmxremote.password.template jmxremote.password
  1. 修改该文件,去掉如下内容的注释。
monitorRole  QED
controlRole  R&D

添加运行参数

如果使用 tomcat 就修改 bin/catalina.sh (.bat) 文件添加参数。

# 在 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"

使用 jar 包启动就在启动时添加参数:

启动参数示例:

java 
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=9999 
-Dcom.sun.management.jmxremote.local.only=false 
-Dcom.sun.management.jmxremote.authenticate=false  
-Dcom.sun.management.jmxremote.ssl=false 
-Djava.rmi.server.hostname= your server host 
-jar xxx.jar

JMX Server 还会随机额外的去监听两个端口,所以在远程连接时我们本地的JMX在连接时也会尝试去连接监听端口。

jps -l

lsof -i|grep xxx
参数 说明
-Dcom.sun.management.jmxremote 允许使用 JMX 远程连接
-Dcom.sun.management.jmxremote.port 指定 JMX 启动的代理端口,即 visualvm 要连接的端口
-Dcom.sun.management.jmxremote.local.only 只允许本地连接
-Dcom.sun.management.jmxremote.authenticate 指定了JMX是否启用鉴权(需要用户名,密码鉴权)
-Dcom.sun.management.jmxremote.ssl 指定 JMX 是否启用 ssl
-Djava.rmi.server.hostname 指定服务器主机名
-Dcom.sun.management.jmxremote.rmi.port 将这个端口和 jmx.port 的端口设置成一个端口,这样防火墙就只需要放行一个端口
-Dcom.sun.management.jmxremote.access.file 用户权限文件路径
-Dcom.sun.management.jmxremote.password.file 密码文件路径

通过以上配置便可以在 VisualVM 中使用 JMX 连接。