Jvm需要很长时间来解析localhost的ip-address

时间:2016-09-22 10:38:45

标签: java scala sbt scalatest macos-sierra

我似乎对" sbt test"的性能有问题。升级到macOS Sierra之后。在以前版本的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 Mid-2015 2.8GHz i7,16GB RAM,1TB SSD。

8 个答案:

答案 0 :(得分:279)

我遇到了同样的问题。升级后Tomcat从15秒到6分钟来初始化Spring语境...禁用csrutils并没有为我解决问题。

通过在映射到/etc/hosts地址的127.0.0.1文件中添加我的Mac主机名(即Macbook.local或Mac上的任何内容),解决问题以及::1就像这样:

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

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

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

问题与(我相信)有关localhost名称解析如何工作以及java.net.InetAddr类如何检索地址有关。我与几位同事核实过,显然并没有发生在升级到塞拉利昂的所有人身上,但我仍然在调查这一变化的根源。

无论如何,解决方案与antid0te立即实施和工作的解决方案相同。

答案 1 :(得分:33)

正确答案: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

答案 2 :(得分:6)

我有同样的问题。我的春季启动应用需要60秒才能在塞舌斯开始,而优胜美地则需要25秒。

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

答案 3 :(得分:2)

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

当人们在升级后看到问题时,假设10.12改变了主机名的解析方式是有意义的,即至少10.11主机名始终被解析,而10.12只有在启用了服务时才解决系统偏好设置>分享(有10.11的人可以证实这一点)。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

将更新安装到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 :(得分:0)

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

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

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

然后将my.mac添加到/ etc / hosts就可以了。

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

答案 7 :(得分:0)

我在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。我没有解释为什么会发生这种情况,但是我很高兴。