问题描述
今天在用Oracle JDK自带的Java VisualVM监视远程虚拟机上的Web服务时发现不能正常连接的问题,远程服务启动参数是这样的:
java \
-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar service.jar
看着没有什么问题,但是用VisualVM连接就会报出
无法使用service:jmx:rmi:///jndi/rmi://xxx.xxx.xxx.xxx:1099/jmxrmi连接到xxx.xxx.xxx.xxx:1099
问题分析
因为我当前的电脑同时开启了IPv4和IPv6双栈,所以造成JVM会去优先使用IPv6协议发起远程连接,但对端主机对于IPv6并没有提供支持(如没有监听IPv6端口),导致无法连接。
解决方法
在启动VisualVM时候在参数上附加-J-Djava.net.preferIPv4Stack=true
,强制使用IPv4协议发起连接。