InetAddress.getLocalHost()运行缓慢(超过30秒)


74

使用以下代码:

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秒才能执行。机器是具有Java 1.8.0_60的2015 Macbook Pro。

为什么要花这么长时间?


您可以调试一下InetAddress.getLocalHost(),看看它在哪里花费时间
wero 2015年

2
这将是DNS错误配置。检查反向查找是否正常工作。它与Java没有任何关系。@wero
user207421

禁用IPv6或将其设置为“仅本地”有帮助吗?JVM可能首先要做IPv6解析。
chnrxn


如果您关注他的博客,他将首先使用我的:)并在下面对我的回答进行评论。
imrichardcole '16

Answers:


143

可以通过添加以下内容来解决此问题/etc/hosts(假设hostname命令的输出为my-macbook

127.0.0.1   my-macbook
::1         my-macbook

这将使时间恢复到更合适的时间(<1秒)


2
它有效,并且在故障排除时对我有帮助:-)我在此处添加了有关osx sierra的问题的答案,并且我在此博客文章中
thoeni

2
有时名称不是那么明显,首先要找到它,然后运行hostname命令,然后修改您的/ etc / hosts文件,在我的情况下,名称为macbooks-MacBook-Air,您会看到127.0.0.1 localhost macbooks-MacBook- Air.local :: 1本地主机macbooks-MacBook-Air.local
Vladimir Stazhilov

是的,它可以工作,但是您可能希望按照答案中的Octavian R.的建议保留localhost主机名。
安托万·马丁

33

此问题在使用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是我的计算机名称。


我遇到了Intelij的问题,该公司不想构建我的gradle应用程序。我还在以下位置找到了更好的解释:thoeni.io/post/macos-sierra-java
Yvonne Marggraf

2
我认为mac.local应该用hostname命令返回的任何值替换。是对的吗?
stiemannkj1

7

我怀疑这里的延迟是由于DNS解析失败导致的。可能您的DNS服务器配置不正确。30秒可能表示DNS解析超时。

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

编辑:您可能想知道为什么此方法根本不做任何主机解析。显然,它是Java网络库中内置的反欺骗机制的一部分。有关更多详细信息,请参见此帖子的已接受答案:InetAddress.getCanonicalHostName()返回IP而不是主机名


7

上面的答案在我的Mac上有效,您可以这样尝试:

步骤1,从此处输入链接说明下载inetTester.jar

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

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

它需要5s来运行测试,并且显示我的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)

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


2

在具有Java 1.8.0_92和1.80_112的MacBook Pro上,此问题仍然存在,对InetAddress.getLocalhost()的调用需要> 5秒。修改后的/ etc / hosts解决方案不起作用。仅切换回Java 1.8.0_051即可解决此问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.