Подтвердить что ты не робот

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.

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

4b9b3361

Ответ 1

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

127.0.0.1   macbook
::1         macbook

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

Ответ 2

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

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

EDIT: Вы можете задаться вопросом, почему этот метод вообще выполняет любое разрешение хоста. По-видимому, это часть механизма защиты от спуфинга, встроенного в сетевую библиотеку Java. См. Принятый ответ этого сообщения для более подробной информации: InetAddress.getCanonicalHostName() возвращает IP вместо Hostname

Ответ 3

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

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

Это содержимое моего файла /etc/hosts:

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

В моем случае mac - мое имя компьютера.

Ответ 4

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

Ответ 5

Вышеупомянутый ответ работает на моем mac, вы можете попробовать его следующим образом:

Шаг 1, загрузите inetTester.jar из введите ссылку здесь

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

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

для запуска теста требуется 5 секунд, и он показывает имя хоста моего mac.

шаг 3, измените /etc/hosts:

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 мс. 5s → 6ms, приятно.