无法远程连接到JMX?

问题描述 投票:49回答:10

由于一些奇怪的原因,我无法使用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)

问题是什么?

java jmx
10个回答
78
投票

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

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


0
投票

我的两分钱给上面的答案..

我看到大多数答案只提到了主机名但没有提到端口。如果我们没有指定端口,那么服务器将动态分配RMI端口。如果两个服务器位于同一子网或没有防火墙问题,则不会出现任何问题。如果有任何疑虑,我们可以添加以下JVM参数来冻结。

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

例如:

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

确保RMI和JMX端口都应该相同。更多信息,click here


26
投票

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

  1. 检查服务器公共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打开所有端口

瞧。


9
投票

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


8
投票

我经历过这样的问题:它永远地说“添加”并且似乎无法连接。我通过更改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连接时,我指定了“external_IP_of_server:2222”


7
投票

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


2
投票

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


1
投票

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


1
投票

自从我刚加入以来,我无法赞同Hett的答案,但它让我的生命从另一周的反复试验中拯救了!

这是一个工作Dockerfile的示例:

FROM store/oracle/serverjre:8 

RUN mkdir -p /opt/app

ENV APP_PATH /opt/app

WORKDIR $APP_PATH   

COPY . $APP_PATH

CMD ["java", \
     "-Dcom.sun.management.jmxremote", \
     "-Dcom.sun.management.jmxremote.port=9010", \
     "-Dcom.sun.management.jmxremote.rmi.port=9010", \
     "-Dcom.sun.management.jmxremote.authenticate=false", \
     "-Dcom.sun.management.jmxremote.ssl=false", \
     "-Djava.rmi.server.hostname=12.345.67.89", \
     "-jar", \
     "app-service-0.0.1-SNAPSHOT.jar"]

EXPOSE 9010

0
投票

如果您的机器示例没有错误的IP,请查看/ etc / hosts:127.0.0.1 localhost 127.0.0.2 your_machine 185.12.58.2 your_machine(适用于您机器的IP)

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

© www.soinside.com 2019 - 2024. All rights reserved.