Jvm需要很长时间来解析本地主机的ip地址



升级到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 mid 2015 2.8GHz i7, 16GB内存,1TB SSD。

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

通过添加我的Mac主机名(即Macbook)来解决问题。本地的,或者不管你的Mac叫什么)在/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/

在这篇文章中,我还链接到一个github项目,以帮助排除问题并验证解决方案。

问题与(我相信)本地主机名解析如何工作以及java.net.InetAddr类如何检索地址有关。我和几个同事核实了一下,显然并不是每个升级到Sierra的人都这样,但我仍在调查这种变化的根源。

无论如何,解决方案与antid0立即实现并起作用的解决方案相同。

正确答案:Jvm需要很长时间来解析本地主机的ip地址

给懒惰的人:

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秒,而在Yosemite上启动需要25秒。

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

启用例如:系统首选项>共享>远程登录,导致主机名被自动分配一个IP地址

当人们在升级后看到问题时,假设10.12改变了主机名的解析方式是有意义的,即至少在10.11中主机名总是被解析,而在10.12中只有在系统首选项>共享中启用服务才会被解析(10.11的人可以确认这一点)。

安装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

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

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

我的主机名是"我的Mac"之类的东西,无法解析。在设置中,它显示可以使用mymac.local

对计算机进行寻址。

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

添加我。MAC到/etc/hosts帮助了他们。

所以我猜实际的问题是:这只发生在你的计算机名包含任何不是字母的东西时。当主机名和dns条目不匹配时,操作系统会自动删除此条目。(可以手动添加)

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

当我改变我的主主机名和Bonjour主机名只包含字母数字字符它解决了这个问题。这个想法来自于一个同事,当他遇到类似的问题时,他在某个地方读到了这个建议(他不记得在哪里了)。

从这个指南中得到灵感,我遵循了以下步骤:

首先,修改主主机名
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。我无法解释为什么会这样,但我很高兴。

最新更新