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

时间:2015-10-22 20:03:07

标签: java

使用以下代码:

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秒。 Machine是2015 Macbook Pro with Java 1.8.0_60。

为什么这需要这么长时间?

5 个答案:

答案 0 :(得分:104)

可以通过在/ etc / hosts中添加以下内容来解决此问题(假设主机名为macbook

127.0.0.1   macbook
::1         macbook

这会将时间返回到更合适的时间(<1秒)

答案 1 :(得分:9)

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

可以在此处找到解决方案:https://github.com/thoeni/inetTester

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

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

就我而言, mac 是我的电脑名称。

答案 2 :(得分:5)

我怀疑这里的延迟是由于尝试DNS解析失败造成的。也许您的DNS服务器配置不正确。 30秒可能代表DNS解析的超时。

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

编辑:您可能想知道为什么这种方法可以完成任何主机解析。显然,它是内置于Java网络库的反欺骗机制的一部分。有关详细信息,请参阅此帖子的已接受答案:InetAddress.getCanonicalHostName() returns IP instead of Hostname

答案 3 :(得分:2)

在带有Java 1.8.0_92和1.80_112的MacBook Pro上,此问题仍然存在,对InetAddress.getLocalhost()的调用需要&gt; 5秒。使用修改后的/ etc / hosts的解决方案不起作用。只有切换回Java 1.8.0_051才能解决这个问题。

答案 4 :(得分:1)

以上答案适用于我的Mac,你可以这样试试:

第1步,从enter link description here

下载inetTester.jar

第2步,在你的mac上运行它。这是我的mac上的结果:

$ java -jar ./inetTester.jar
Calling the hostname resolution method...
Method called, hostname MacBook-Pro.local, elapsed time: 5009 (ms)

运行测试需要5秒,它会显示我的mac的主机名。

步骤3,修改/ etc / hosts:

127.0.0.1   MacBook-Pro.local
::1         MacBook-Pro.local

主机是步骤2中显示的内容。之后,再次运行测试:

$ java -jar ./inetTester.jar
Calling the hostname resolution method...
Method called, hostname MacBook-Pro.local, elapsed time: 6 (ms)

是的,它只有6ms。 5s - &gt; 6毫秒,很好。