Jvm долго определяет ip-адрес для localhost


112

Кажется, у меня проблемы с производительностью «теста sbt» (который включает поиск имен / IP-адресов локальных хостов) после обновления до macOS Sierra. В предыдущей версии 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 i7 2,8 ГГц, 16 ГБ оперативной памяти, 1 ТБ SSD.


Я использую gradle clean testи имею ту же проблему.
Макс Пэн

Об этой ошибке сообщается в OpenJDK: bugs.openjdk.java.net/browse/JDK-8143378. Она была решена как дубликат другой ошибки, которая не будет исправлена. Вероятно, его следует открыть снова.
Lóránt Pintér,

Ответы:


327

У меня такая же проблема. Tomcat перешел с 15 секунд до 6 минут на инициализацию весеннего контекста после обновления ... отключение csrutils не решило проблему для меня.

Я решил проблему, добавив свое имя хоста Mac (например, Macbook.local или что-то еще, что называется на вашем 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, чтобы помочь устранить проблему и проверить решение.

Проблема связана (я считаю) с тем, как работает разрешение имен localhost и как класс java.net.InetAddr получает адреса. Я проверил с несколькими коллегами, и, очевидно, это случается не со всеми, кто перешел на Sierra, но я все еще исследую корни этого изменения.

В любом случае решение было тем же, что реализовал antid0te, и сразу сработало.


Та же проблема ... И я могу подтвердить, что отключение SIP у меня тоже не сработало.
Borges

Отлично работает, вы можете проверить с помощью проекта github github.com/thoeni/inetTester
christmo

21
Нашел! Это не имя Mac .. Его имя хоста. Набрав "имя хоста" в терминале, можно указать правильное имя хоста.
VK321

1
Это все еще наблюдается в OSX 10.14.2, годы спустя. Большое спасибо за исправление.
Малькольм Крам

1
macOS Mojave 10.14.4, все еще проблема. Добавление имени хоста после localhostк линиям обратной связи IPv4 и IPv6 ( 127.0.0.1, ::1) все еще проверено исправлением!
Dog

43

Правильный ответ: Jvm долго определяет ip-адрес для 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

4
Потрясающие! Это увеличило время запуска моего minecraft с 12 до 0,5 секунды.
Боб

@camikiller Я вижу 2 разных значения для имени хоста и общего доступа> Имя компьютера, уточните, какое из них использовать?
vikramvi

Лучшее решение - обновить MacOS @vikramvi
camikiller

@camikiller позже я сделал для apple.stackexchange.com/questions/66611/… , чтобы иметь то же имя, но все равно он не работает. Мне нужно сделать какие-то другие настройки в Совместном доступе?
vikramvi

@vikramvi Попробуйте вручную отредактировать свой /etc/hostsфайл и добавить 2 хоста
camikiller

6

У меня та же проблема. Моему приложению с весенней загрузкой требуется 60 секунд для запуска на Sierra против 25 секунд на Yosemite.

Во время отладки я понял, что проблема исходит от InetAddress.getLocalHost (). Я изменил свой файл хоста, чтобы добавить свое имя хоста для 127.0.0.1 и :: 1, и теперь приложение запускается так же быстро, как и раньше.


2
Привет, я нашел это объяснение высокого уровня, если оно помогает (но все еще не ясно, что изменилось в выпуске MacOS Sierra): «Когда вы запрашиваете имя хоста, JDK разрешает его в IP-адреса. Затем он пытается выполнить обратный поиск этих адресов. и проверяет, что хотя бы один из результатов сопоставляется с именем входного хоста. Этот обратный поиск медленный. Медленный процесс не ограничивается JVM. Все, что в ОС пытается выполнить такой обратный поиск, будет медленным без соответствующая конфигурация в / etc / hosts. " (из github.com/spring-projects/spring-boot/issues/7087 )
thoeni,

3

Включение, например, «Системные настройки»> «Совместное использование»> «Удаленный вход» приводит к тому, что имени хоста автоматически назначается IP-адрес.

Поскольку люди видят проблемы после обновления, имеет смысл предположить, что 10.12 изменил способ разрешения имени хоста, то есть, по крайней мере, с 10.11 имя хоста всегда разрешается, а с 10.12 оно разрешается только в том случае, если служба включена в Системных настройках> Совместное использование (кто-то с 10.11 может это подтвердить).


У меня 10.12.5, но ваше решение не сработало. какая у вас версия?
vikramvi

@vikramvi У меня 10.12.6, и при установке все работает, как описано. При стандартном файле / etc / hosts и отключенном совместном использовании ping $ (hostname) завершается с ошибкой неизвестного хоста. При включенном совместном использовании имя хоста преобразуется в IP-адрес моей VLAN. Что касается Java (8u141), вызов InetAddress.getLocalHost () занимает 5 секунд в случае отключения совместного использования. При включенном совместном использовании время выполнения снижается до 13 мс.
jurajw

Это действительно работает (хотя это действительно странно), в основном, даже если «Удаленный вход» уже был отмечен, снимите его, а затем проверьте снова. Вещи снова начинают работать. Вы должны сделать это один раз / boot LOL. Также обратите внимание, что если вы когда-либо убивали процесс «mDNS» (ранее), вам нужно будет проделать этот трюк, чтобы вообще вернуть адреса .local. Или используйте способ / etc / hosts для более постоянного исправления
rogerdpack

1

Я думаю, что это общая проблема новой ОС. У меня аналогичная проблема: у меня есть веб-приложение, развернутое на tomcat. На El Capitan он запускался за 10 секунд, теперь это занимает 95 секунд, и клиент (настольное приложение на основе Swing) не может подключиться к нему (или, по крайней мере, это заняло много времени). Я думаю, что это связано с сетевым взаимодействием, потому что простое тестовое консольное приложение работает хорошо.


1
Отключение SIP решает мою проблему. macossierra-slow.com/…
Андрас Гетван

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

Вы можете получить myhostname командой в $hostnameлюбом месте терминала.


0

Принятый ответ мне помог! Просто добавив это здесь, объясняя, в чем, по моему мнению, для меня была проблема:

Мое имя хоста было чем-то вроде «Мой Mac», которое не могло быть разрешено. В настройках он показал мне, что к компьютеру можно обращаться с помощью mymac.local

Я подумал, что это пространство, и переименовал свой Mac в «my.mac», но даже это не помогло, поскольку автоматически добавленный DNS все еще был mymac.local

Тогда помогло добавление my.mac в / etc / hosts.

Итак, я предполагаю, в чем настоящая проблема: это происходит только тогда, когда имя вашего компьютера содержит что-либо, кроме буквы. Это автоматически удаляется ОС, и тогда имя хоста и запись DNS не совпадают. (что можно исправить, добавив его вручную)


1
Я думаю, проблема глубже, чем это ... мое имя хоста состояло из обычных буквенных букв, но добавление его в / etc / hosts решило для меня ряд странных проблем,
Магнус

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 в том же каталоге, несмотря на мои предпочтения. У меня нет объяснений, почему это произошло, но я очень доволен.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.