【问题标题】:InetAddress.getLocalHost() slow to run (30+ seconds)InetAddress.getLocalHost() 运行缓慢(30 多秒)
【发布时间】:2016-01-22 05:50:52
【问题描述】:

使用以下代码:

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() 看看它在哪里花费时间
  • 这将是 DNS 配置错误。检查反向查找是否正常工作。它与Java没有任何关系。 @wero
  • 禁用 IPv6 或将其设置为“仅限本地”是否有帮助? JVM 可能首先进行 IPv6 解析。
  • 如果你关注他的博客,他首先使用了我的 :) 并且还在下面评论了我的回答。

标签: java


【解决方案1】:

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

127.0.0.1   my-macbook
::1         my-macbook

这会将时间返回到更合适的位置(

【讨论】:

  • 它有效,这在故障排除时帮助了我 :-) 我在 osx sierra here 上添加了一个问题的答案,我还提到了你的解决方案 on this blog post
  • 有时名称不是那么明显,要找出它首先运行主机名命令然后修改您的 /etc/hosts 文件,在我的情况下它的名称是 macbooks-MacBook-Air 如您所见127.0.0.1 本地主机 macbooks-MacBook-Air.local ::1 本地主机 macbooks-MacBook-Air.local
  • 是的,它可以工作,但您可能希望按照 Octavian R. 在下面的答案中建议的那样保留 localhost 主机名。
【解决方案2】:

此问题出现在使用 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

就我而言,ma​​c 是我的计算机名。

【讨论】:

  • 我遇到了 Intelij 的问题,它不想构建我的 gradle 应用程序。我还在以下位置找到了更好的解释:thoeni.io/post/macos-sierra-java
  • 我认为mac.local 应该替换为hostname 命令返回的任何值。对吗?
【解决方案3】:

上面的答案在我的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)

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

第三步,修改/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 毫秒。

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-30
        • 1970-01-01
        • 2012-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-07
        相关资源
        最近更新 更多