使用 Java 7,我可以使用以下属性启动启用了 JMX 的 JVM,而不会出现任何问题:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.port=8787
如果我使用 Java 8(Java build 1.8.0_45-b14;Java HotSpot(TM) 64-Bit Server VM build 25.45-b02,混合模式),我总是会收到如下错误:
java.net.MalformedURLException:本地主机名未知:java.net.UnknownHostException:185-69-214-74.ded.intelignet.com.br:185-69-214-74.ded.intelignet.com.br:未知错误
如果我添加此系统属性,也会发生错误:
-Djava.rmi.server.hostname=185.69.214.74
但是,如果我不启用 JMX,我可以成功启动 Java 8。
为什么我在 Java 7 下看不到同样的问题?是什么原因导致的?即使启用了 JMX,我该怎么做才能避免此错误?
更多细节:
$ hostname
mybox
$ hostname -i
185.69.214.74
$ host $(hostname -i)
74.214.69.185.in-addr.arpa domain name pointer 185-69-214-74.ded.intelignet.com.br.
一种可能的解决方法是编辑 /etc/hosts 以添加此行:
185.69.214.74 185-69-214-74.ded.intelignet.com.br
但是,我不被允许这样做,所以我必须找到另一种方法来解决这个问题。
答案1
在调试类java.net.InetAddress
、方法之后getLocalHost
,我发现它调用Inet4AddressImpl.getLocalHostName
,当我使用“-Djava.net.preferIPv4Stack=true”时,它会返回“185-69-214-74.ded.intelignet.com.br”。如果我省略“java.net.preferIPv4Stack”,则InetAddress.getLocalHost
调用Inet6AddressImpl.getLocalHostName
,它会返回“mybox”,问题就解决了。
换句话说,仅当以下条件同时成立时才会发生“UnknownHostException”:
- -Djava.net.preferIPv4Stack=true
- Java 版本 = 8
因此我将省略-Djava.net.preferIPv4Stack=true
,因为我还没有找到解决此问题的其他方法。