无法远程连接到JMX?

sor*_*rin 52 java 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到这个端口.

尽管如此,在花费了相当多的时间尝试之后,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)
Run Code Online (Sandbox Code Playgroud)

问题是什么?

小智 81

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

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

  • 这个答案帮助我通过端口转发连接到在Kubernetes中运行的JVM:-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port = 10099 -Dcom.sun.management.jmxremote.rmi.port = 10099 -Djava.rmi.server.hostname = 127.0.0.1 -Dcom.sun.management.jmxremote.local.only = false -Dcom.sun.management.jmxremote.authenticate = false -Dcom.sun.management.jmxremote.ssl = false即将主机名设置为127.0.0.1并将jmx和rmi端口设置为相同的值! (7认同)
  • 我可以确认添加此设置解决了从VisualVM连接到远程VM的问题。好答案。 (2认同)

Mar*_*usz 32

这些步骤对我有用(服务器端防火墙后面的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打开所有端口

瞧.

  • 就我而言,我丢失了“ java.rmi.server.hostname”……添加该属性后,我能够使用Java Java VisualVM连接到远程VM (2认同)

joh*_*hlo 9

除了听你指定的端口(1100)的JMX服务器也监听随机选择的(临时)端口.检查,例如,lsof -i|grep java如果你在linux/osx上,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> 
Run Code Online (Sandbox Code Playgroud)

然后当我添加jmx连接时,我指定了"external_IP_of_server:2222"


Abd*_*ull 7

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

从我的本地机器,我习惯做端口转发:

ssh -L 9001:localhost:9000 tomcat.example.com
Run Code Online (Sandbox Code Playgroud)

(因此远程端口9000被转发到我的本地机器的端口9001).

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

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

    ssh -L 9000:localhost:9000 tomcat.example.com
Run Code Online (Sandbox Code Playgroud)

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

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

另请参阅正确设置参数.


小智 6

由于我刚刚加入,我无法对 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
Run Code Online (Sandbox Code Playgroud)


var*_*han 6

我对上述答案的两分钱..

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

-Dcom.sun.management.jmxremote.rmi.port
Run Code Online (Sandbox Code Playgroud)

前任:

<option name="-Dcom.sun.management.jmxremote.rmi.port" value="11001"/>
Run Code Online (Sandbox Code Playgroud)

确保 RMI 和 JMX 端口应该相同。更多信息,请点击这里