远程Linux服务器Tomcat通过VisualVM连接jstatd失败排查求助
嘿,我碰到过好多次这种VisualVM连远程Tomcat的坑,咱们一步步来排查,应该能解决:
一、先确认jstatd的配置和运行状态
- 检查你的
jstatd.all.policy文件内容是否正确,权限不足是最常见的问题之一。正确的配置应该包含:
注意如果grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; };${java.home}解析有问题,直接写JDK的绝对路径更稳妥,比如/usr/lib/jvm/java-1.8.0-openjdk-amd64/lib/tools.jar,避免路径错误导致权限拒绝。 - 给jstatd加日志参数启动,看有没有报错:执行
jstatd -J-Djava.security.policy=/path/to/jstatd.all.policy -J-Djava.rmi.server.logCalls=true,然后观察控制台输出,比如有没有端口绑定失败、权限不足的提示,这些日志能直接帮你定位问题。 - 确认jstatd和Tomcat用的是同一个JDK版本,不同版本的JDK之间RMI通信可能存在兼容性问题,用
jstatd -version和tomcat/bin/version.sh分别检查版本是否一致。
二、排查RMI的端口和网络限制
- 虽然telnet 1099能通,但jstatd除了1099的注册端口,还会随机分配一个数据传输端口,这个端口大概率被防火墙挡住了。你可以手动指定这个端口,启动命令改成:
这里把数据端口指定为1100,然后在远程服务器的防火墙开放1099和1100两个端口,再尝试连接。jstatd -p 1099 -J-Djava.security.policy=/path/to/jstatd.all.policy -J-Djava.rmi.server.hostname=你的远程服务器IP -J-Djava.rmi.server.port=1100 - 强制RMI返回指定IP:很多时候服务器的hostname是本地无法解析的,导致VisualVM拿到主机名后连不上。所以启动jstatd时一定要加
-J-Djava.rmi.server.hostname=你的公网/内网IP,让RMI直接返回可访问的IP地址。 - 检查本地笔记本的防火墙,暂时关闭试试,排除本地防火墙阻止VisualVM发起连接的可能。
三、开启Tomcat的JMX远程连接(关键!)
- jstatd只是用来发现JVM进程,但要在VisualVM里看到Tomcat应用,Tomcat本身必须开启JMX远程连接。修改Tomcat的
bin/catalina.sh文件,添加以下JVM参数到CATALINA_OPTS中:
把CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9000 -Dcom.sun.management.jmxremote.rmi.port=9000 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=你的远程服务器IP"jmxremote.port和jmxremote.rmi.port设为同一个端口(比如9000),避免随机端口的问题,然后开放这个端口。重启Tomcat后,直接在VisualVM里添加JMX连接,输入地址service:jmx:rmi:///jndi/rmi://你的IP:9000/jmxrmi,这种方式比jstatd发现更可靠。
四、其他容易忽略的排查点
- 检查远程服务器的SELinux是否开启,如果开启了,可能会阻止RMI通信。临时关闭试试:
setenforce 0,如果能连接了,再去配置SELinux的允许规则。 - 用
ps aux | grep jstatd确认jstatd进程是否在运行,有没有意外退出。 - 检查本地VisualVM的插件:打开“工具”->“插件”,确保MBeans、JConsole相关的插件都已安装,避免功能缺失导致看不到应用。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

