С тех пор, как я перешел на Yosemite, я заметил, что попытки разрешить локальный хост в моей домашней сети занимали много времени (иногда более минуты), поэтому я решил попробовать и выяснить, почему.
Вот как выглядел мой исходный файл / etc / hosts, исходя из предположения, что имя хоста моей машины было teetotal :
01
02
03
04
05
06
07
08
09
10
11
12
13
|
$ cat /etc/hosts ## # Host Database # # localhost is used to configure the loopback interface # when the system is booting. Do not change this entry. ## 127.0.0.1 localhost 255.255.255.255 broadcasthost ::1 localhost #fe80::1%lo0 localhost 127.0.0.1 wuqour. local 127.0.0.1 teetotal |
Я настроил небольшой тест, который повторил проблему:
01
02
03
04
05
06
07
08
09
10
11
12
13
|
import java.net.InetAddress; import java.net.UnknownHostException; public class LocalhostResolution { public static void main( String[] args ) throws UnknownHostException { long start = System.currentTimeMillis(); InetAddress localHost = InetAddress.getLocalHost(); System.out.println(localHost); System.out.println(System.currentTimeMillis() - start); } } |
который имеет следующий вывод:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
Exception in thread "main" java.net.UnknownHostException: teetotal- 2 : teetotal- 2 : nodename nor servname provided, or not known at java.net.InetAddress.getLocalHost(InetAddress.java: 1473 ) at LocalhostResolution.main(LocalhostResolution.java: 9 ) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 57 ) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 43 ) at java.lang.reflect.Method.invoke(Method.java: 606 ) at com.intellij.rt.execution.application.AppMain.main(AppMain.java: 134 ) Caused by: java.net.UnknownHostException: teetotal- 2 : nodename nor servname provided, or not known at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) at java.net.InetAddress$ 1 .lookupAllHostAddr(InetAddress.java: 901 ) at java.net.InetAddress.getAddressesFromNameService(InetAddress.java: 1293 ) at java.net.InetAddress.getLocalHost(InetAddress.java: 1469 ) ... 6 more |
Каким-то образом мое имя хоста изменилось на teetotal-2, поэтому я добавил следующую запись в / etc / hosts :
1
|
127.0 . 0.1 teetotal- 2 |
Теперь, если мы запустим программу, мы увидим этот вывод:
1
2
|
teetotal- 2 / 127.0 . 0.1 5011 |
Это все еще занимает 5 секунд, чтобы решить, что намного дольше, чем я ожидал. После перерыва, указывающего на код, кажется, что он пытается выполнить разрешение IPv6, а не IPv4, поэтому я добавил для этого также запись / etc / hosts :
1
|
:: 1 teetotal- 2 |
Теперь разрешение гораздо быстрее:
1
2
|
teetotal- 2 / 127.0 . 0.1 6 |
Счастливые дни!
Ссылка: | InetAddressImpl # lookupAllHostAddr медленно / зависает от нашего партнера по JCG Марка Нидхэма в блоге Марка Нидхэма . |