Jvm 需要很长时间来解析 localhost 的 ip 地址

Jvm takes a long time to resolve ip-address for localhost

升级到 macOS Sierra 后,"sbt test"(包括查找本地主机 names/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,但也没有帮助。

P.S。我正在 运行宁 Macbook Pro 2015 年中期 2.8GHz i7、16GB 内存、1TB 固态硬盘。

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

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

解决了问题,方法是在 /etc/hosts 文件映射到 127.0.0.1 地址以及 ::1 像这样:

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

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

在 post 上,我还 link github project 来帮助解决问题并验证解决方案。

问题与(我相信)本地主机名称解析的工作方式以及 java.net.InetAddr class 如何检索地址有关。我与少数同事进行了验证,显然并不是所有升级到 Sierra 的人都会遇到这种情况,但我仍在调查此更改的根源。

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

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

上需要 25 秒

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

正确答案:

对于懒人:

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

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

由于人们在升级后看到问题,假设 10.12 改变了主机名的解析方式是有道理的,即至少在 10.11 中主机名总是被解析,而在 10.12 中只有当服务是在“系统偏好设置”>“共享”中启用(使用 10.11 的人可以确认这一点)。

安装 Mac Sierra 10.12 (16A323) 更新后出现了一个奇怪的问题。在具有以下排序问题的主机文件中。

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

您可以在终端的任意位置通过命令 $hostname 获取 我的主机名

接受的答案对我有帮助!只是在这里添加这个来解释我认为我的问题是:

我的 Hostname 类似于 "My Mac",无法解析。在设置中它告诉我可以用 mymac.local

寻址计算机

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

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

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

我在 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。我无法解释为什么会这样,但我很高兴。