Jvm потребує тривалого часу, щоб вирішити ip-адресу для localhost


112

У мене, здається, виникають проблеми з виконанням "sbt test" (який включає пошук локальних імен / IP-адрес) після оновлення до macOS Sierra. На попередній версії OS X закінчилося близько 40-50 секунд. macOS Sierra часи набагато вищі за це. Останній пробіг у мене був близько 15 хвилин. Часи компіляції приблизно такі ж, як у програмі "El Capitan".

Я єдиний зі своєї команди, який спробував цей новий macOS, тому я не можу сказати, чи це відбувається лише на моєму mac чи це універсальна проблема.

У мого колеги виникли подібні проблеми з Ubuntu, і це було пов’язано з генерацією випадкових чисел, що уповільнюють тести - Повільна відповідь служби Times: Java SecureRandom & / dev / random

На жаль, це не спрацювало для мене. Спочатку я спробував це на JDK 8u54, а потім спробував оновлення до JDK 8u102, і це також не допомогло.

PS Я запускаю Macbook Pro середина 2015 року 2,8 ГГц i7, 16 ГБ оперативної пам’яті, 1 ТБ SSD.


Я використовую gradle clean testта маю те саме питання.
Макс Пенг

Це помилка, про яку повідомляється OpenJDK: bugs.openjdk.java.net/browse/JDK-8143378 Вона була вирішена як дублікат іншої помилки, яку не виправити. Це, мабуть, має бути відновлено.
Лоран Пінтере

Відповіді:


326

У мене була така ж проблема. 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 отримує адреси. Я перевірив з кількома колегами, і, мабуть, це не трапляється з усіма, хто перейшов на Сьєрру, але я все ще досліджую коріння цієї зміни.

Рішення все одно було тим самим, що і antid0te реалізували та працювали негайно.


Те саме питання ... І я можу підтвердити, що відключення SIP не працювало і для мене.
борже


21
Знайшов це! Її не mac ім'я .. Її ім'я хоста. Ввівши "ім'я хоста" в терміналі можна дати правильне ім'я хоста.
VK321

1
Це все ще спостерігається на OSX 10.14.2, років потому. Дякую за виправлення.
Малькольм Крум

1
macOS Mojave 10.14.4, все ще проблема. Додавання імені хоста після localhostIPv4 та IPv6 циклів зворотного зв'язку ( 127.0.0.1, ::1) все ще перевірено виправлення!
Собака

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
Дивовижно! Це збільшило час запуску мого майнкрафта з 12 секунд до 0,5 секунди.
Боб

@camikiller Я бачу 2 різних значення для імені хоста vs Спільний доступ> Ім'я комп’ютера, уточнюйте, яке саме використовувати?
vikramvi

Краще рішення - оновити свій MacOS @vikramvi
camikiller

@camikiller пізніше я зробив за apple.stackexchange.com/questions/66611/… , щоб мати те ж ім’я, але все ще не працює. Чи потрібно робити деякі інші налаштування в спільному доступі?
vikramvi

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

6

У мене така ж проблема. Моїй програмі весняного завантаження потрібно 60 секунд, щоб запуститись на Сьєрра проти 25 секунд на Йосеміті.

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


2
Привіт, я знайшов це пояснення високого рівня, якщо це допомагає (але все ще не ясно, що змінилося у версії MacOS Sierra): "Коли ви запитуєте ім'я хоста, JDK вирішує його на IP-адреси. Потім він намагається зворотний пошук цих адрес і перевіряє, що хоча б один з результатів відображається до імені вхідного хоста. Це зворотний пошук, який повільний. Повільність не обмежується JVM. Все в ОС, що намагається здійснити такий зворотний пошук, буде повільним без відповідна конфігурація в / etc / hosts. " (від github.com/spring-projects/spring-boot/isissue/7087 )
thoeni

3

Увімкнення, наприклад, Системних налаштувань> Обмін> Віддалений вхід, призводить до того, що імені хоста автоматично присвоюється IP-адреса.

Оскільки після оновлення люди бачать проблеми, має сенс припустити, що 10.12 змінив спосіб вирішення імені хоста, тобто принаймні з 10.11 ім'я хоста завжди вирішено, тоді як з 10.12 воно вирішується лише у тому випадку, якщо послуга ввімкнено у налаштуваннях системи> Спільний доступ (хтось із 10.11 міг це підтвердити).


Я 10.12.5, але ваше рішення не спрацювало. яка у вас версія?
vikramvi

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

Це спрацьовує (хоча це і справді дивно). В основному навіть якщо "Віддалений вхід" вже було встановлено, зніміть його, а потім перевірте ще раз. Все починає працювати знову. Ви повинні це зробити один раз / завантажувати LOL. Зауважте також, що якщо ви коли-небудь вбивали процес "mDNS" (раніше), вам потрібно буде зробити цей трюк, щоб взагалі повернути .local адреси. Або скористайтеся способом / etc / hosts для більш постійного виправлення
rogerdpack

1

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


1
Відключення SIP вирішує мою проблему. macossierra-slow.com/…
Andras Gyetvan

1

Це було дивне питання після встановлення оновлення до Mac Sierra 10.12 (16A323). У файлі хостів із наведеним нижче відсортовано проблему.

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

Ви можете отримати ім'я myhost за допомогою команди $hostnameбудь-де в терміналі.


0

Прийнята відповідь мені допомогла! Просто додавши сюди пояснення, що на мою думку, для мене було таке:

Моє ім'я хоста було щось на кшталт "My Mac", яке не вдалося вирішити. У налаштуваннях мені показали, що за комп’ютером можна вирішувати mymac.local

Я подумав, що це простір, і перейменував мак на "my.mac", але навіть це не допомогло, оскільки dns автоматично додався все ще mymac.local

Тоді додавання my.mac до / etc / hosts допомогло.

Тож я здогадуюсь, що насправді проблема: Це трапляється лише тоді, коли ім’я комп'ютера містить усе, що не є літерою. Це автоматично видаляється os, а потім ім'я хоста та dns не відповідають. (що можна виправити вручну, додавши його)


1
Я думаю, що проблема проходить глибше, ніж це ... моє ім'я хоста було всіма нормальними літерами альфа, але додавши його до / etc / hosts вирішило цілу низку дивних проблем для мене
Magnus

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, з якими виникли проблеми, і, сподіваємось, вони більше не повинні зависати.

Зі сторони, це також вирішило ще одне питання, у мене було те, коли нова вкладка в Terminal не запускає баш в той же каталог, незважаючи на мої вподобання. У мене немає пояснень, чому це сталося, але я дуже задоволений.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.