由于一些奇怪的原因,我无法使用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)
问题是什么?
添加-Djava.rmi.server.hostname = host ip
。即使我遇到了同样的问题,这也解决了问题。
添加此-Djava.rmi.server.hostname = host ip
强制RMI服务使用主机IP而不是127.0.0.1
我的两分钱给上面的答案..
我看到大多数答案只提到了主机名但没有提到端口。如果我们没有指定端口,那么服务器将动态分配RMI端口。如果两个服务器位于同一子网或没有防火墙问题,则不会出现任何问题。如果有任何疑虑,我们可以添加以下JVM参数来冻结。
-Dcom.sun.management.jmxremote.rmi.port
例如:
<option name="-Dcom.sun.management.jmxremote.rmi.port" value="11001"/>
确保RMI和JMX端口都应该相同。更多信息,click here
这些步骤对我有用(服务器端防火墙后面的Debian是通过本地Mac上的VPN实现的):
瞧。
除了监听您指定的端口(1100)之外,JMX服务器还监听随机选择的(临时)端口。检查,例如如果您使用的是linux / osx,请使用lsof -i|grep java
,java进程监听哪些端口,并确保您的防火墙也为临时端口打开。
我经历过这样的问题:它永远地说“添加”并且似乎无法连接。我通过更改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”
使用端口转发时我遇到了类似的问题。我有一台远程机器,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?)在同一端口上侦听。
我发现了问题,我的rmi服务是在主机ip上运行的,它是“127.0.0.1”。要远程连接到jvm,我必须将外部ip绑定到主机名。要在unix系统中执行此操作,请使用命令hostname
获取主机名的名称。然后检查分配给主机名的ip,找出这个使用ping $(hostname)
你会看到系统正在ping hosname的ip。如果您的主机IP是默认的“127.0.0.1”并且您想要更改它,只需以超级用户身份编辑文件/ etc / hosts。重新启动rmi服务后,您可以从远程计算机访问它。
如果你运行jar
文件(通过-jar选项),你必须在-jar
选项之前指定所有其他选项!
自从我刚加入以来,我无法赞同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
如果您的机器示例没有错误的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而忘记了另一个