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

imr*_*ole 58 java

使用以下代码:

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

我得到这个输出:

Thu Oct 22 20:58:22 BST 2015
Thu Oct 22 20:58:52 BST 2015
Run Code Online (Sandbox Code Playgroud)

换句话说,执行30秒.Machine是2015 Macbook Pro with Java 1.8.0_60.

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

imr*_*ole 118

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

127.0.0.1   macbook
::1         macbook
Run Code Online (Sandbox Code Playgroud)

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

  • 它有效,这在故障排除时对我有帮助:-) 我在 osx sierra [here](http://stackoverflow.com/questions/39636792/sbt-test-extremely-slow-on-macos-) 上添加了一个问题的答案sierra/39698914#39698914) 我也提到了你的解决方案 [在这篇博文中](https://thoeni.io/post/macos-sierra-java/) (2认同)
  • 有时名称不是那么明显,要找出它,首先运行主机名命令,然后修改您的 /etc/hosts 文件,在我的情况下,名称是 macbooks-MacBook-Air,如您所见 127.0.0.1 localhost macbooks-MacBook- Air.local :: 1 本地主机 macbooks-MacBook-Air.local (2认同)

Oct*_* R. 16

使用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
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为“mac.local”应该替换为“hostname”命令返回的任何值。是对的吗? (3认同)

shi*_*slm 9

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

第一步,从thoeni/inetTester下载inetTester.jar

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

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

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

第三步,修改/etc/hosts:

127.0.0.1   MacBook-Pro.local
::1         MacBook-Pro.local
Run Code Online (Sandbox Code Playgroud)

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

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

是的,它只有 6 毫秒。


bis*_*oje 5

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

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

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