无法远程连接到JMX?

时间:2012-07-24 10:08:27

标签: java 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到这个端口。

但是,在花费了相当多的时间尝试之后,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)

有什么问题?

10 个答案:

答案 0 :(得分:76)

添加-Djava.rmi.server.hostname = host ip。即使我遇到了同样的问题,这也是诀窍。

添加此-Djava.rmi.server.hostname = host ip强制RMI服务使用主机IP而不是127.0.0.1

答案 1 :(得分:26)

这些步骤对我有用(服务器端防火墙后面的Debian是通过本地Mac上的VPN实现的):

  1. 检查服务器public ip

    的ifconfig

  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]

  3. 运行应用程序

  4. 查找正在运行的java进程的进程ID

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

    netstat -lp | grep [来自第4步的pid]

  6. 打开防火墙上步骤5中的所有端口

  7. 瞧。

答案 2 :(得分:9)

除了监听您指定的端口(1100)之外,JMX服务器还会侦听随机选择的(临时)端口。检查,例如使用lsof -i|grep java如果您使用的是linux / osx,那么java进程会监听哪些端口,并确保您的防火墙也可以为临时端口打开。

答案 3 :(得分:7)

我经历过这样的问题:“添加'永远,似乎无法连接。我通过更改jvisualvm代理设置(工具 - >选项 - >网络)来解决问题。一旦我将选项更改为No Proxy,我就能够连接。我的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连接时,我指定了&#34; external_IP_of_server:2222&#34;

答案 4 :(得分:6)

使用端口转发时遇到了类似的问题。 我有一台远程机器,Tomcat在localhost:9000上监听JMX交互。

从我的本地机器,我习惯用以下方式进行端口转发:

ssh -L 9001:localhost:9000 tomcat.example.com

(因此远程端口9000被转发到我本地计算机的端口9001)。

然后,当我尝试使用VisualVM连接到localhost:9001时,连接被拒绝。 JMX似乎要求两侧的端口号相同。

所以我的解决方案是使用端口号9000和9000:

    ssh -L 9000:localhost:9000 tomcat.example.com

现在我的本地机器的VisualVM通过localhost:9000成功连接到远程机器的Tomcat。

确保您没有任何其他服务(开发计算机上的Tomcat?)在同一端口上侦听。

另请查看setting up parameters correctly

答案 5 :(得分:2)

我发现了问题,我的rmi服务是在主机ip上运行的,这是&#34; 127.0.0.1&#34;。要远程连接到jvm,我必须将外部ip绑定到主机名。要在unix系统中执行此操作,请使用命令hostname获取主机名的名称。然后检查分配给主机名的IP,找出这个用途ping $(hostname)你会看到系统正在ping这个主机名的IP。如果您的主机IP是默认值&#34; 127.0.0.1&#34;并且您想要更改它,只需以超级用户身份编辑文件/ etc / hosts。重新启动rmi服务后,您可以从远程计算机访问它。

答案 6 :(得分:1)

如果运行jar文件(通过-jar选项),则必须在-jar选项之前指定所有其他选项!

答案 7 :(得分:1)

自从我加入以来,我无法接受Hett的回答,但是这使我免于一周的反复试验挽救了我的生命!

这是一个可用的Dockerfile的示例:

UPDATE MS 
    SET    MS.NAME = OC.NAME
    FROM   OPENQUERY(WZ12,
      'select EMP, NAME from Test') OC 
   INNER JOIN [dbo].[TEST1] MS 
     ON OC.EMP = MS.EMP

答案 8 :(得分:0)

在/ etc / hosts中查找是否您的计算机没有错误的IP 例如: 127.0.0.1本地主机 127.0.0.2 your_machine 185.12.58.2 your_machine(适合您计算机的IP)

JMX采用IP 127.0.0.2,而忘记了另一个

答案 9 :(得分:0)

我对上述答案的两分钱。

我看到大多数答案都只提到主机名,而没有提到端口。如果未指定端口,则服务器将动态分配RMI端口。如果两个服务器都在同一子网中,或者没有防火墙问题,就不会有任何问题。如果有任何疑问,我们可以在JVM参数下面添加冻结。

-Dcom.sun.management.jmxremote.rmi.port

例如:

<option name="-Dcom.sun.management.jmxremote.rmi.port" value="11001"/>

确保RMI和JMX端口都应该相同。要了解更多,click here