在 Java 8 中啟用 JMX 時出現 UnknownHostException
使用 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
但是,我不允許這樣做,所以我必須找到另一種方法來解決這個問題。
在調試類
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
,因為我還沒有找到解決這個問題的另一種方法。