Ответ 1
Проблема может быть решена путем добавления следующего в /etc/hosts (при условии, что имя хоста macbook
:
127.0.0.1 macbook
::1 macbook
Это возвращает время к чему-то более подходящему (< 1 second)
Со следующим кодом:
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.
Почему это так долго?
Проблема может быть решена путем добавления следующего в /etc/hosts (при условии, что имя хоста macbook
:
127.0.0.1 macbook
::1 macbook
Это возвращает время к чему-то более подходящему (< 1 second)
Я подозреваю, что задержка возникла из-за неудачной попытки разрешения DNS. Возможно, ваши DNS-серверы настроены неправильно. 30 секунд, вероятно, представляют собой тайм-аут в разрешении DNS.
Причина, по которой ваше решение улучшило скорость, заключается в том, что добавление записи в файл hosts разрешает локальное имя узла локально и, таким образом, пропускает попытку разрешить имя хоста против реального (удаленного) DNS-сервера.
EDIT: Вы можете задаться вопросом, почему этот метод вообще выполняет любое разрешение хоста. По-видимому, это часть механизма защиты от спуфинга, встроенного в сетевую библиотеку Java. См. Принятый ответ этого сообщения для более подробной информации: InetAddress.getCanonicalHostName() возвращает IP вместо Hostname
Эта проблема появляется в 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 - мое имя компьютера.
На MacBook Pro с Java 1.8.0_92 и 1.80_112 эта проблема все еще существует, для вызова InetAddress.getLocalhost() требуется > 5 секунд. Решение с измененным /etc/hosts не работает. Только переключение на Java 1.8.0_051 решает эту проблему.
Вышеупомянутый ответ работает на моем 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, приятно.