62

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

我检查了一下,我可以从本地和远程远程登录到这个端口。

尽管如此,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)

问题是什么?

4

11 回答 11

100

添加-Djava.rmi.server.hostname = host ip. 即使我面临同样的问题,这也成功了。

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

于 2012-08-16T13:46:33.357 回答
38

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

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

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

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

    netstat -lp | grep [pid from step 4]

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

瞧。

于 2015-02-10T20:20:26.980 回答
10

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

于 2012-07-24T10:20:46.380 回答
10

我遇到了永远显示“正在添加”并且似乎无法连接的问题。我通过更改 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”

于 2014-07-25T17:09:45.623 回答
7

使用端口转发时我遇到了类似的问题。我有一台带有 Tomcat 的远程机器,在localhost:9000.

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

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 通过 . 成功连接到远程机器的 Tomcat localhost:9000

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

还要看看正确设置参数

于 2016-04-05T16:23:10.783 回答
6

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

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

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

前任:

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

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

于 2019-04-05T11:27:44.400 回答
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
于 2019-02-25T20:57:25.760 回答
4

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

于 2018-09-20T07:46:35.617 回答
2

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

于 2014-04-28T10:29:07.103 回答
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 而忘记另一个

于 2019-02-27T16:12:08.117 回答
0

感谢@Arpit Agarwal,以下内容对我有用。添加了这个对我有用的附加 jvm 参数。

    -Djava.rmi.server.hostname=192.168.1.16

对我有用的完整列表。

 -Dcom.sun.management.jmxremote 
 -Dcom.sun.management.jmxremote.port=21845
 -Dcom.sun.management.jmxremote.ssl=false 
 -Dcom.sun.management.jmxremote.authenticate=false
 -Dcom.sun.management.jmxremote.local.only=false 
 -Djava.rmi.server.hostname=192.168.1.16
 -Dcom.sun.management.jmxremote.rmi.port=10099 
于 2021-08-17T15:40:51.587 回答