Java

在 Java 8 中啟用 JMX 時出現 UnknownHostException

  • January 9, 2017

使用 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,因為我還沒有找到解決這個問題的另一種方法。

引用自:https://serverfault.com/questions/698135