在 Java 8 中启用 JMX 时出现 UnknownHostException

在 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

但是,我不被允许这样做,所以我必须找到另一种方法来解决这个问题。

答案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,因为我还没有找到解决此问题的其他方法。

相关内容