2012-07-24 104 views
38

由于某种奇怪的原因,我无法使用VisualVMjconsole连接到JMX。无法远程连接到JMX?

用来启动虚拟机中的参数进行监控:

-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) 

什么问题?

+0

仅提供-Dcom.sun.management.jmxremote.port = 1100后,您可以在本地运行VisualVM,但通过端口连接而不是通过连接? – 2012-08-02 20:17:29

+0

如果有防火墙发挥参见[1] [1] [这个问题]:HTTP://计算器。com/a/19315119/2870472 – supdog 2013-10-11 10:10:58

+0

通过ssh隧道设置,更容易很多 – 2017-10-31 11:50:08

回答

9

除了监听您指定的端口(1100)之外,JMX服务器还会监听随机选择的(临时)端口。检查,例如与lsof -i|grep java如果你在linux/osx上,java进程会监听哪些端口并确保你的防火墙对于临时端口是开放的。

+0

这是在内部网上,没有防火墙,此外我甚至尝试使用DHCP IP进行本地连接,并且失败。有趣的,但VisualVM能够检测本地实例并连接到它们,但可能它不使用TCP端口。 – sorin 2012-07-24 11:04:16

+1

VM参数看起来正确。错误的选项/网址到jconsole? – johlo 2012-07-24 11:59:10

+0

在VisualVM上,我右键单击远程添加JMX连接并引入'subdomain.example.com:1100'。 – sorin 2012-07-24 12:10:18

54

添加-Djava.rmi.server.hostname = host ip。即使我面临同样的问题,这就是诀窍。

另外这款-Djava.rmi.server.hostname = host ip军队RMI服务的使用主机的ip 127.0.0.1而不是

+1

我可以确认添加此设置解决了从VisualVM连接到远程VM时的问题。很好的答案。 – axel22 2014-10-06 19:12:03

+1

当JConsole尝试连接时,我在通信上做了一个TCP转储。很显然,在与JMX端口的握手中,它将中继在-Djava.rmi.server.hostname中给出的主机,然后尝试连接它。 – 2015-09-08 18:54:39

+0

在哪里添加建议变量更改? – Salman 2016-06-23 08:49:22

2

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

+1

在某些环境中'hostname'会给你错误的答案。要在AWS EC2上获得正确的外部IP,请使用:'ip = $(curl -s http://169.254.169.254/latest/meta-data/public-ipv4)' – 2016-10-24 04:44:49

7

我遇到了问题,它说'永远添加',似乎无法连接。我通过更改jvisualvm代理设置(工具 - >选项 - >网络)来解决问题。一旦我将选项更改为无代理服务器,我就可以连接。我的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”

19

这些是为我工作(Debian的防火墙后面的服务器上的步骤一边是从我本机的Mac已达VPN):

  1. 检查服务器的IP

    主机名-i

  2. 使用JVM PARAMS:

 
-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=[server ip from step 1] 
  • 运行应用程序

  • 运行java程序的查找过程ID

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

    netstat -lp | grep [pid from step 4]

  • 打开所有来自步骤5防火墙

  • 瞧上端口。

    +0

    谢谢! 我缺少'netstat -lp | grep [pid from step 4]' – user454322 2015-04-22 10:25:32

    +1

    在我的情况下,我错过了“java.rmi.server.hostname”...之后,添加了该属性,我能够连接到我的远程虚拟机使用java VisualVM – 2016-04-14 19:04:57

    +0

    在我们的事实证明,需要更多的端口,而不仅仅是通过'jmxremote.port'指定的端口。我们询问ops打开VPN后面的机器的所有端口,并能够连接。意外的是并没有减少端口曝光的机器还没有提供更多的数据。 – fionbio 2016-04-21 18:53:00

    4

    我在使用端口转发时遇到类似的问题。 我有一台远程机器,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