出于某种奇怪的原因,我无法使用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)
有什么问题?
答案 0 :(得分:76)
添加-Djava.rmi.server.hostname = host ip
。即使我遇到了同样的问题,这也是诀窍。
添加此-Djava.rmi.server.hostname = host ip
强制RMI服务使用主机IP而不是127.0.0.1
答案 1 :(得分:26)
这些步骤对我有用(服务器端防火墙后面的Debian是通过本地Mac上的VPN实现的):
检查服务器public 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中的所有端口
瞧。
答案 2 :(得分:9)
除了监听您指定的端口(1100)之外,JMX服务器还会侦听随机选择的(临时)端口。检查,例如使用lsof -i|grep java
如果您使用的是linux / osx,那么java进程会监听哪些端口,并确保您的防火墙也可以为临时端口打开。
答案 3 :(得分:7)
我经历过这样的问题:“添加'永远,似乎无法连接。我通过更改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连接时,我指定了&#34; external_IP_of_server:2222&#34;
答案 4 :(得分:6)
使用端口转发时遇到了类似的问题。
我有一台远程机器,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?)在同一端口上侦听。
答案 5 :(得分:2)
我发现了问题,我的rmi服务是在主机ip上运行的,这是&#34; 127.0.0.1&#34;。要远程连接到jvm,我必须将外部ip绑定到主机名。要在unix系统中执行此操作,请使用命令hostname
获取主机名的名称。然后检查分配给主机名的IP,找出这个用途ping $(hostname)
你会看到系统正在ping这个主机名的IP。如果您的主机IP是默认值&#34; 127.0.0.1&#34;并且您想要更改它,只需以超级用户身份编辑文件/ etc / hosts。重新启动rmi服务后,您可以从远程计算机访问它。
答案 6 :(得分:1)
如果运行jar
文件(通过-jar选项),则必须在-jar
选项之前指定所有其他选项!
答案 7 :(得分:1)
自从我加入以来,我无法接受Hett的回答,但是这使我免于一周的反复试验挽救了我的生命!
这是一个可用的Dockerfile的示例:
UPDATE MS
SET MS.NAME = OC.NAME
FROM OPENQUERY(WZ12,
'select EMP, NAME from Test') OC
INNER JOIN [dbo].[TEST1] MS
ON OC.EMP = MS.EMP
答案 8 :(得分:0)
在/ etc / hosts中查找是否您的计算机没有错误的IP 例如: 127.0.0.1本地主机 127.0.0.2 your_machine 185.12.58.2 your_machine(适合您计算机的IP)
JMX采用IP 127.0.0.2,而忘记了另一个
答案 9 :(得分:0)
我对上述答案的两分钱。
我看到大多数答案都只提到主机名,而没有提到端口。如果未指定端口,则服务器将动态分配RMI端口。如果两个服务器都在同一子网中,或者没有防火墙问题,就不会有任何问题。如果有任何疑问,我们可以在JVM参数下面添加冻结。
-Dcom.sun.management.jmxremote.rmi.port
例如:
<option name="-Dcom.sun.management.jmxremote.rmi.port" value="11001"/>
确保RMI和JMX端口都应该相同。要了解更多,click here