出于某种奇怪的原因,我无法使用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
Mar*_*usz 32
这些步骤对我有用(服务器端防火墙后面的Debian是通过本地Mac上的VPN实现的):
检查服务器公共IP
使用ifconfig
使用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]
运行应用程序
查找正在运行的java进程的进程ID
检查JMX/RMI使用的所有端口
netstat -lp | grep [来自第4步的pid]
从防火墙上的步骤5打开所有端口
瞧.
除了听你指定的端口(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"
使用端口转发时我遇到了类似的问题.我有一台远程机器,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)
我对上述答案的两分钱..
我看到大多数答案只提到了主机名,但没有提到端口。如果我们没有指定端口,那么服务器将动态分配 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 端口应该相同。更多信息,请点击这里
归档时间: |
|
查看次数: |
70852 次 |
最近记录: |