使用以下代码:
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。
为什么这需要这么长时间?
答案 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毫秒,很好。