无法远程连接到JMX?

由于一些奇怪的原因,我无法使用VisualVMjconsole连接到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访问):

  1. 检查服务器IP

    主机名-i

  2. 使用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]
  1. 运行应用程序

  2. find正在运行的java进程的进程ID

  3. 检查JMX / RMI使用的所有端口

    netstat -lp | grep [pid from step 4]

  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服务之后,可以从远程机器到达它。