关于Java:Jvm需要很长时间才能解析localhost的IP地址

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

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

我是团队中唯一尝试这种新macOS的人,因此我无法确定它是否仅在我的Mac上发生,还是普遍存在。

我的同事在Ubuntu上也有类似的问题,这与生成随机数有关,这减慢了测试的速度-服务响应速度慢:Java SecureRandom和/ dev / random

不幸的是,这对我没有用。 最初,我在JDK 8u54上进行了尝试,然后尝试更新为JDK 8u102,但这样做也没有帮助。

附言 我正在运行Macbook Pro 2015年中的2.8GHz i7、16GB内存,1TB SSD。


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

我通过在映射到127.0.0.1地址和::1/etc/hosts文件上添加我的Mac主机名(即Macbook.local或您的Mac所用的名称)来解决此问题:

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

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

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

问题(我相信)与本地名称解析如何工作以及java.net.InetAddr类如何获取地址有关。我与几个同事进行了核实,显然升级到Sierra的每个人都不会遇到这种情况,但是我仍在调查这种变化的根源。

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


正确答案:Jvm需要很长时间才能解析localhost的IP地址

对于懒惰的人:

1
2
3
4
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


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

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


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

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


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

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

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


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


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

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

从本指南中汲取灵感,这些是我遵循的步骤:

首先,更改主要主机名

1
sudo scutil --set HostName <new host name>

例如。:

1
sudo scutil --set HostName eggsandwich

接下来,更改Bonjour主机名(出于完整性考虑,我没有尝试过此步骤,因此可能不需要这样做)。

1
sudo scutil --set LocalHostName <new host name>

例如。:

1
sudo scutil --set LocalHostName eggsandwich

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

附带说明,这也解决了我遇到的另一个问题,即尽管我的偏好设置,终端中的新选项卡都不会在同一目录中启动bash。 我没有解释为什么会发生这种情况,但是我很高兴。


被接受的答案帮助了我!只需在此处添加说明我对我的问题是:

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

我以为是空间,将我的mac重命名为" my.mac",但是即使这样也没有帮助,因为自动添加的dns仍然是mymac.local

然后将my.mac添加到/ etc / hosts即可。

因此,我猜实际的问题是什么:仅当您的计算机名称包含不是字母的任何内容时,才会发生这种情况。操作系统会自动将其删除,然后主机名和dns条目不匹配。 (可以通过手动添加来解决)