120

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

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

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

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

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

4

8 回答 8

367

我有同样的问题。升级后,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 项目,以帮助解决问题并验证解决方案。

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

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

于 2016-09-26T09:16:01.963 回答
49

正确答案:jvm 需要很长时间才能解析 localhost 的 ip-address

对于懒惰的人:

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
于 2016-11-28T21:03:05.573 回答
7

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

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

于 2016-09-27T16:02:41.100 回答
4

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

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

于 2017-01-04T23:24:16.957 回答
2

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

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

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

于 2017-12-21T03:37:54.740 回答
1

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

于 2016-09-23T07:51:40.253 回答
1

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

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

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

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

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

于 2018-07-06T06:57:02.317 回答
0

我在我的 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,尽管我有偏好。我无法解释为什么会发生这种情况,但我很高兴。

于 2019-06-26T10:55:24.320 回答