史上最全JMX远程连接失败问题踩坑和总结,涉及多种环境:本地、局域网测试环境、线上生产环境。
这里不介绍VisualVM的基本教程,那些随便搜一下都有,主要介绍一下博主在不同环境使用,自己遇到的坑。
想要查看和监控JVM运行情况,VisualVM是一种不错的选择。
VisualVM远程连接JVM,最方便的方法是通过 jmx,即在jvm启动参数增加jmx配置。
网上大体都是如下:
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=8099
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
以上配置,本地环境可以,如果是远程的话,这样是不行的。
远程连接需要增加 rmi 配置:
-Djava.rmi.server.hostname=192.168.180.1
注意:另外需要检查 hostname –i,看解析出来是否包含本地的IP,如是只有127.0.0.1或者其他的IP,会连接不上。
配置正确的显示如下:
[user ~]$ hostname -i
127.0.0.1 192.168.180.1
[user ~]$
以上配置加了后,测试环境可以连接了,但是线上环境还是不行。
继续找原因,发现是防火墙的原因屏蔽了相关接口。
在Java启动时,JMX会绑定一个接口,RMI也会绑定一个接口,在复杂网络环境下,有可能你通过打开防火墙允许了JMX端口的通过,但是由于没有放行RMI,远程连接也是会失败的。
这是因为JMX在远程连接时,会随机开启一个RMI端口作为连接的数据端口,这个端口会被防火墙给阻止,以至于连接超时失败。在Java7u25版本后,可以使用 -Dcom.sun.management.jmxremote.rmi.port参数来指定这个端口;好消息是,你可以将这个端口和jmx.port的端口设置成一个端口,这样防火墙就只需要放行一个端口就可以了。
增加 rmi 端口配置:
-Dcom.sun.management.jmxremote.rmi.port=8099
加了后,可以远程连接线上生产环境了。
生产环境还需要注意,找运维配合开放指定 ip 和 端口的权限, netstat 查询自己配置的端口(如8099)是否已被监听,
可以通过 telnet ip port 来检查 端口是否请求通,如:
telnet 192.168.180.1 8099
总结:
JMX 最全配置:
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=8099 \
-Dcom.sun.management.jmxremote.local.only=true \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.rmi.port=8099 \
-Djava.rmi.server.hostname=192.168.180.1
References
————————————————
版权声明:本文为CSDN博主「CleverApe」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_27641935/article/details/102919542
网友评论