2015-10-22 3 views
36

С помощью следующего кода:InetAddress.getLocalHost() медленно работать (30+ секунд)

try { 
    System.out.println(new Date()); 
    InetAddress hostName = InetAddress.getLocalHost(); 
    System.out.println(new Date()); 
} catch (UnknownHostException e) { 
    e.printStackTrace(); 
} 

я получаю этот выход:

Thu Oct 22 20:58:22 BST 2015 
Thu Oct 22 20:58:52 BST 2015 

Другими словами 30 секунд для выполнения. Машина - 2015 Macbook Pro с Java 1.8.0_60.

Почему это так долго?

+0

вы можете отладить в 'InetAddress.getLocalHost()', чтобы увидеть, где он проводит время – wero

+1

Это будет неправильная настройка DNS. Убедитесь, что обратный поиск работает правильно. Это не имеет ничего общего с Java. @wero – EJP

+0

Отключает ли IPv6 или устанавливает его в «локальную»? Вначале JVM может принимать IPv6-разрешение. – chnrxn

ответ

83

Проблема может быть решена путем добавления следующих строк в/и т.д./хостов (предполагается, что имя хоста является macbook:

127.0.0.1 macbook 
::1   macbook 

Это возвращает время к чему-то более подходящее (< 1 секунду)

+0

Вышеупомянутые работы для меня. Возможно, вы можете предложить альтернативное решение? – imrichardcole

+0

@EJP, если вы собираетесь спускать вниз, вы должны знать, какой правильный ответ? Вышеизложенное прекрасно работает для меня. – imrichardcole

+0

Это работает, и это помогло мне при устранении неполадок :-) Я добавил ответ на вопрос о osx sierra [здесь] (http://stackoverflow.com/questions/39636792/sbt-test-extremely-slow-on-macos -sierra/39698914 # 39698914), и я упомянул ваше решение также [в этом блоге] (https://thoeni.io/post/macos-sierra-java/) – thoeni

4

Подозреваю задержка здесь была вызвана неудачной попыткой разрешения DNS. Возможно, ваши DNS-серверы настроены неправильно. 30 секунд, вероятно, представляют собой тайм-аут в разрешении DNS.

Причина, по которой ваши soluti при увеличении скорости происходит добавление записи в файл hosts, позволяющей локализовать имя хоста локально и, таким образом, пропустить попытку разрешить имя хоста против реального (удаленного) DNS-сервера.

РЕДАКТИРОВАТЬ: Вы можете задаться вопросом, почему этот метод вообще принимает любое разрешение хоста. По-видимому, это часть механизма защиты от спуфинга, встроенного в сетевую библиотеку Java. См. Принятый ответ этого сообщения для получения дополнительной информации: InetAddress.getCanonicalHostName() returns IP instead of Hostname

2

На MacBook Pro с Java 1.8.0_92 и 1.80_112 эта проблема все еще существует, вызов InetAddress.getLocalhost() требует> 5 секунд. Решение с измененным/etc/hosts не работает. Эта проблема решает только переход на Java 1.8.0_051.

5

Эта проблема возникает в MacOS Sierra с использованием Java8, обновления равны или больше 60 (jdk1.8.0_60.jdk, jdk1.8.0_77.jdk и т. Д.).

Решение можно найти здесь: https://github.com/thoeni/inetTester.

Это содержание моей/и т.д./файл хостов:

127.0.0.1 localhost mac.local 
::1   localhost mac.local 

В моем случае, макинтош мое имя компьютера.

0

выше ответ работает на моем Mac, вы можете попробовать это так:

шаг 1, скачать inetTester.jar из enter link description here

шаг 2, запустить его на своем компьютере. вот результат на мой макинтош:

$ java -jar ./inetTester.jar 
Calling the hostname resolution method... 
Method called, hostname MacBook-Pro.local, elapsed time: 5009 (ms) 

он принимает 5s запустить тест, и он показывает имя хоста моего макинтош.

шаг 3, изменить/и т.д./хосты:

127.0.0.1 MacBook-Pro.local 
::1   MacBook-Pro.local 

хозяином является то, что показывает на шаге 2.и после этого повторите тест:

$ java -jar ./inetTester.jar 
Calling the hostname resolution method... 
Method called, hostname MacBook-Pro.local, elapsed time: 6 (ms) 

Да, он поставляется с 6 мс. 5 с -> 6 мс, приятно.

Смежные вопросы