【问题标题】:Jvm takes a long time to resolve ip-address for localhostJvm 需要很长时间才能解析 localhost 的 ip-address
【发布时间】:2017-01-30 21:34:07
【问题描述】:

升级到 macOS Sierra 后,“sbt 测试”(包括查找本地主机名称/IP 地址)的性能似乎存在问题。在以前的 OS X 版本上,大约需要 40-50 秒才能完成。 macOS Sierra 时间远高于此。我最后一次跑步大约是 15 分钟。编译时间与“El Capitan”的编译时间大致相同。

我是我团队中唯一一个尝试这个新 macOS 的人,所以我不知道它是只发生在我的 Mac 上还是普遍存在的问题。

我的同事在 Ubuntu 上遇到了类似的问题,这与随机数生成减慢了测试速度有关 - Slow service response Times : Java SecureRandom & /dev/random

不幸的是,这对我不起作用。最初我在 JDK 8u54 上尝试过,然后尝试更新到 JDK 8u102,但也没有用。

附:我正在运行 Macbook Pro Mid-2015 2.8GHz i7、16GB 内存、1TB SSD。

【问题讨论】:

  • 我正在使用 gradle clean test 并遇到同样的问题。
  • 这是向 OpenJDK 报告的错误:bugs.openjdk.java.net/browse/JDK-8143378 它已作为另一个无法修复的错误的副本解决。它可能应该重新打开。

标签: java scala jvm localhost macos-sierra


【解决方案1】:

我遇到了同样的问题。升级后,Tomcat 从 15 秒缩短到 6 分钟来初始化 Spring 上下文......禁用 csrutils 并没有解决我的问题。

我通过在映射到127.0.0.1 地址的/etc/hosts 文件以及@ 987654327@这样的:

127.0.0.1   localhost mbpro.local
::1         localhost mbpro.local

如果您有兴趣,可以在此处找到有关问题和解决方案的一些详细信息: https://thoeni.io/post/macos-sierra-java/

在帖子中,我还链接到 github project,以帮助解决问题并验证解决方案。

问题与(我相信)localhost 名称解析的工作方式以及 java.net.InetAddr 类如何检索地址有关。我与几个同事进行了验证,显然升级到 Sierra 的每个人都不会发生这种情况,但我仍在调查这种变化的根源。

无论如何,解决方案与antid0te 实施并立即生效的解决方案相同。

【讨论】:

  • 同样的问题...我可以确认禁用 SIP 对我也不起作用。
  • 很好用,你可以查看github项目github.com/thoeni/inetTester
  • 找到了!它不是mac名称..它的主机名。通过在终端中输入“主机名”可以给出正确的主机名。
  • 多年后仍然在 OSX 10.14.2 上看到这个。非常感谢您的修复。
  • macOS Mojave 10.14.4,还是有问题。在localhost 之后将主机名附加到 IPv4 和 IPv6 环回行(127.0.0.1、::1)仍然经过验证修复!
【解决方案2】:

正确答案:Jvm takes a long time to resolve ip-address for localhost

对于懒惰的人:

sudo sed -i bak "s^127\.0\.0\.1.*^127.0.0.1 localhost $(hostname)^g" /etc/hosts
sudo sed -i bak "s^::1.*^::1 localhost $(hostname)^g" /etc/hosts
sudo ifconfig en0 down
sudo ifconfig en0 up

【讨论】:

  • 太棒了!这将我的 Minecraft 启动时间从 12 秒提高到 0.5 秒。
  • @camikiller 我看到主机名与共享有 2 个不同的值 > 计算机名,请说明要使用哪一个?
  • 更好的解决方案是升级你的 MacOS @vikramvi
  • @camikiller 后来我按照apple.stackexchange.com/questions/66611/… 做了相同的名称,但仍然无法正常工作。我需要在共享中进行一些其他设置吗?
  • @vikramvi 尝试手动编辑您的 /etc/hosts 文件并添加 2 个主机
【解决方案3】:

我也有同样的问题。我的 spring-boot 应用程序需要 60 秒才能在 Sierra 上启动,而在 Yosemite 上需要 25 秒。

调试的时候发现问题出在InetAddress.getLocalHost()。 我更改了我的主机文件,为127.0.0.1 和:: 1 添加了我的主机名,现在应用程序启动的速度和以前一样快。

【讨论】:

  • 嗨,如果有帮助,我发现了这个高级解释(但仍然不清楚 MacOS Sierra 版本中发生了什么变化):“当您请求主机名时,JDK 将其解析为 IP 地址。它然后尝试对这些地址进行反向查找并检查是否至少有一个结果映射回输入主机名。正是这种反向查找速度很慢。这种缓慢不仅限于 JVM。操作系统上尝试执行的任何操作如果在 /etc/hosts 中没有适当的配置,这样的反向查找会很慢。” (来自github.com/spring-projects/spring-boot/issues/7087)
【解决方案4】:

启用例如系统偏好设置 > 共享 > 远程登录,主机名会被自动分配一个 IP 地址。

由于人们在升级后看到问题,因此假设 10.12 更改了主机名的解析方式,即至少在 10.11 中始终解析主机名,而在 10.12 中,只有在启用服务时才能解析系统偏好设置 > 共享(10.11 版本的人可以确认这一点)。

【讨论】:

  • 我有 10.12.5 但您的解决方案不起作用。你有哪个版本?
  • @vikramvi 我有 10.12.6 并且对于我的安装来说,事情仍然按照描述工作。在标准 /etc/hosts 文件和共享被禁用的情况下,ping $(hostname) 失败并出现未知主机错误。启用共享后,主机名将解析为我的 VLAN 的 IP。至于 Java (8u141),如果共享禁用,调用 InetAddress.getLocalHost() 需要 5 秒。启用共享后,执行时间降至 13 毫秒。
  • 这确实有效(虽然很奇怪),基本上即使“远程登录”已经被选中,取消选中它,然后再次检查它。事情又开始起作用了。您必须执行一次/启动 LOL。另请注意,如果您曾经(之前)杀死过“mDNS”进程,则需要执行此技巧以完全恢复 .local 地址。或者使用 /etc/hosts 方式进行更永久的修复
【解决方案5】:

将更新安装到Mac Sierra 10.12 (16A323) 后,这是一个奇怪的问题。在下面的 hosts 文件中对问题进行了排序。

::1         localhost <myhostname>.local   <--- Was already present
127.0.0.1   localhost <myhostname>.local   <--- Solved the tomcat loading issue

您可以在终端的任意位置通过命令$hostname 获取myhostname。

【讨论】:

    【解决方案6】:

    我认为这是新操作系统的普遍问题。我有一个类似的问题:我有一个部署到 tomcat 的 Web 应用程序。在 El Capitan 上,它在 10 秒内启动,现在需要 95 秒,并且客户端(基于 Swing 的桌面应用程序)无法连接到它(或者至少花了很多时间)。我认为这与网络通信有关,因为一个简单的测试控制台应用程序运行良好。

    【讨论】:

    【解决方案7】:

    接受的答案对我有帮助!只需在此处添加此内容即可解释我认为对我来说问题所在:

    我的主机名类似于“我的 Mac”,无法解析。在设置中,它向我显示计算机可以使用 mymac.local 进行寻址

    我以为是空格,所以将我的 mac 重命名为“my.mac”,但即使这样也无济于事,因为自动添加的 dns 仍然是 mymac.local

    将 my.mac 添加到 /etc/hosts 会有所帮助。

    所以我猜实际问题是什么:只有当您的计算机名称包含任何非字母时才会发生这种情况。这会被操作系统自动删除,然后主机名和 dns 条目不匹配。 (可以手动添加)

    【讨论】:

    • 我认为问题比这更深...我的主机名都是普通的字母,但将它添加到 /etc/hosts 为我解决了一系列奇怪的问题
    【解决方案8】:

    我在 Mac 上遇到了同样的问题。

    当我将主要和 Bonjour 主机名更改为仅包含字母数字字符时,它解决了问题。这个想法来自一位同事,他在遇到类似问题时曾在某处阅读过该建议(他不记得在哪里)。

    从this guide 中汲取灵感,这是我遵循的步骤:

    首先,更改主主机名

    sudo scutil --set HostName <new host name>
    

    例如:

    sudo scutil --set HostName eggsandwich
    

    接下来,更改 Bonjour 主机名(为了完整起见,我从未尝试过不执行此步骤,因此可能不需要它)。

    sudo scutil --set LocalHostName <new host name>
    

    例如:

    sudo scutil --set LocalHostName eggsandwich
    

    现在重新启动您遇到问题的 java 进程,希望它们不再挂起。

    另一方面,这也解决了我遇到的另一个问题,即终端中的新选项卡不会在同一目录中启动 bash,尽管我有偏好。我无法解释为什么会这样,但我很高兴。

    【讨论】:

      猜你喜欢
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 2012-12-04
      • 2012-12-03
      相关资源
      最近更新 更多