VisualVM远程连接失败踩坑之JMX最全配置

史上最全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

https://stackoverflow.com/questions/20884353/why-java-opens-3-ports-when-jmx-is-configured/21552812#21552812

https://stackoverflow.com/questions/7163173/jmx-enabled-java-application-appears-to-open-a-random-high-order-port-when-jmx-c

发布了14 篇原创文章 · 获赞 11 · 访问量 9326

猜你喜欢

转载自blog.csdn.net/qq_27641935/article/details/102919542