InetAddress.getLocalHost()慢运行(30+秒)

用下面的代码:

try { System.out.println(new Date()); InetAddress hostName = InetAddress.getLocalHost(); System.out.println(new Date()); } catch (UnknownHostException e) { e.printStackTrace(); } 

我得到这个输出:

 Thu Oct 22 20:58:22 BST 2015 Thu Oct 22 20:58:52 BST 2015 

换句话说,执行30秒。 机器是2015年Macbook Pro与Java 1.8.0_60。

为什么这么长时间?

这个问题可以通过将以下内容添加到/ etc / hosts来解决(假设主机名是macbook

 127.0.0.1 macbook ::1 macbook 

这会使时间更合适(<1秒)

我怀疑这个延迟是由于DNSparsing尝试失败造成的。 也许你的DNS服务器configuration不正确。 30秒可能代表DNSparsing的超时。

解决scheme提高速度的原因是,将条目添加到主机文件允许在本地parsing主机名,从而跳过尝试根据实际(远程)DNS服务器parsing主机名的尝试。

编辑:你可能想知道为什么这个方法做任何主机parsing。 显然,它是内置于Javanetworking库中的反欺骗机制的一部分。 有关更多详细信息,请参阅此post的接受答案: InetAddress.getCanonicalHostName()返回IP而不是主机名

在具有Java 1.8.0_92和1.80_112的MacBook Pro上,此问题仍然存在,调用InetAddress.getLocalhost()需要大于5秒。 修改/ etc / hosts的解决scheme不起作用。 只有切换回Java 1.8.0_051解决了这个问题。

这个问题出现在MacOS Sierra使用Java8,更新等于或大于60(jdk1.8.0_60.jdk,jdk1.8.0_77.jdk等)。

解决scheme可以在这里find: https : //github.com/thoeni/inetTester 。

这是我的/ etc / hosts文件的内容:

 127.0.0.1 localhost mac.local ::1 localhost mac.local 

在我的情况下, mac是我的电脑名称。