无法远程连接到JMX?
由于一些奇怪的原因,我无法使用VisualVM
或jconsole
连接到JMX。
用于启动要监视的VM的参数:
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1100
我检查了,我可以从本地和远程telnet到这个端口。
尽pipe如此,VisualVM或jconsole仍然无法连接,花了相当多的时间去尝试。
REMOTE MACHINE with JMX (debian) java version "1.6.0_33" Java(TM) SE Runtime Environment (build 1.6.0_33-b03-424-11M3720) Java HotSpot(TM) 64-Bit Server VM (build 20.8-b03-424, mixed mode) MY WORKSTATION (OS X) java version "1.6.0_26" Java(TM) SE Runtime Environment (build 1.6.0_26-b03) Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
问题是什么?
添加-Djava.rmi.server.hostname = host ip
。 即使我面临同样的问题,这个伎俩。
此-Djava.rmi.server.hostname = host ip
强制RMI服务使用主机ip而不是127.0.0.1
这些是我工作的步骤(Debian在服务器端的防火墙后面,通过本地Mac上的VPN访问):
-
检查服务器IP
主机名-i
-
使用JVM参数:
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port = [jmx port] -Dcom.sun.management.jmxremote.local.only = FALSE -Dcom.sun.management.jmxremote.authenticate = FALSE -Dcom.sun.management.jmxremote.ssl = FALSE -Djava.rmi.server.hostname = [步骤1中的服务器ip]
-
运行应用程序
-
find正在运行的java进程的进程ID
-
检查JMX / RMI使用的所有端口
netstat -lp | grep [pid from step 4]
-
打开防火墙上第5步的所有端口
瞧。
除了监听您指定的端口(1100)之外,JMX服务器还会监听随机select的(临时)端口。 如果你在linux / osx上,使用lsof -i|grep java
检查,java进程会侦听哪个端口,并确保你的防火墙对于临时端口是开放的。
我遇到了永久添加的问题,似乎无法连接。 我通过更改jvisualvm代理设置(工具 – >选项 – >networking)来通过这个问题。 一旦我将选项更改为无代理,我就可以连接。 我的jvm是从以下选项开始的:
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=2222 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=<external_IP_of_server>
然后当我添加了jmx连接时,我指定了“external_IP_of_server:2222”
使用端口转发时,我遇到了类似的问题。 我有一个远程机器,Tomcat在localhost:9000
上监听JMX交互。
在我的本地机器上,我习惯使用以下方式进行端口转发:
ssh -L 9001:localhost:9000 tomcat.example.com
(所以远程端口9000被转发到我的本地机器的端口9001)。
然后,当我尝试使用VisualVM连接到localhost:9001
,连接被拒绝。 JMX似乎要求两端的端口号相同。
所以我的解决scheme是使用端口号9000和9000:
ssh -L 9000:localhost:9000 tomcat.example.com
现在,我的本地计算机的VisualVM通过localhost:9000
成功连接到远程计算机的Tomcat。
确保你没有任何其他服务(开发机器上的Tomcat?)在同一个端口上侦听。
也看看正确设置参数 。
我发现这个问题,我的rmi服务运行在主机ip是“127.0.0.1”。 要远程连接到jvm,我必须将外部IP绑定到主机名。 要在unix系统中执行此操作,请使用命令hostname
来获取hostname
的名称。 然后检查分配给主机名的IP,找出这个使用ping $(hostname)
你会看到系统ping ping $(hostname)
的IP。 如果您的主机ip是默认的“127.0.0.1”,并且您想更改它,只需以超级用户身份编辑文件/ etc / hosts即可。 在重新启动rmi服务之后,可以从远程机器到达它。