我在Amazon EC2实例上运行的某个服务上设置了JMX,但它无法正常运行。我正在使用VisualVM进行连接,在短暂的挂起期后,它会因超时而失败。看起来因为缺少响应数据或滞后而失败。我检查了安全组中是否启用了JMX端口,并且还尝试使用不启用JMX的不同端口,并且在安全组设置中未启用端口,并且两者都立即失败,因此它看起来不同。我的EC2实例和桌面都安装了Ubuntu 12.04和JDK 7.
事实证明,由于连接是SSL安全的,端口没有意义。我有一个私钥,不知道如何将它与JConsole或VisualVM一起使用。
答案 0 :(得分:11)
JMX需要在开放端口上运行的RMI注册表。默认情况下,RMI注册表端口在启动时随机选择,并且与防火墙不兼容。 从JDK7u4开始,您可以使用
-Dcom.sun.management.jmxremote.rmi.port=<port>
设置要使用的RMI端口。然后,您可以在安全组中启用该端口。
请注意上述设置的.rmi.
部分,因为这通常会与com.sun.management.jmxremote.port
设置混淆。你应该不!
答案 1 :(得分:3)
这对我有用。在服务器上设置JMX选项:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=<some port>
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=localhost
打开SSH隧道:
ssh -i /path/to/key -D <some port> username@public_dns_address
启动VisualVM:
jvisualvm -J-Dnetbeans.system_socks_proxy=localhost:<some port> -J-Djava.net.useSystemProxies=true
添加到服务器的远程连接。使用您为JMX指定的端口添加JMX连接。
要明确的是,在上述三种情况下,应该是同一个端口。