java - descargar - InetAddress.getLocalHost() lento para ejecutarse(más de 30 segundos)
java offline (5)
El problema se puede resolver agregando lo siguiente a / etc / hosts (suponiendo que el nombre de host sea
macbook
:
127.0.0.1 macbook
::1 macbook
Esto devuelve el tiempo a algo más adecuado (<1 segundo)
Con el siguiente código:
try {
System.out.println(new Date());
InetAddress hostName = InetAddress.getLocalHost();
System.out.println(new Date());
} catch (UnknownHostException e) {
e.printStackTrace();
}
Me sale esta salida:
Thu Oct 22 20:58:22 BST 2015
Thu Oct 22 20:58:52 BST 2015
En otras palabras, 30 segundos para ejecutar. La máquina es 2015 Macbook Pro con Java 1.8.0_60.
¿Por qué esto lleva tanto tiempo?
En un MacBook Pro con Java 1.8.0_92 y 1.80_112 este problema aún existe, la llamada a InetAddress.getLocalhost () necesita> 5 segundos. La solución con el / etc / hosts modificado no funciona. Solo volver a Java 1.8.0_051 resuelve este problema.
Este problema aparece en MacOS Sierra con Java8, actualizaciones iguales o superiores a 60 (jdk1.8.0_60.jdk, jdk1.8.0_77.jdk, etc.).
La solución se puede encontrar aquí: https://github.com/thoeni/inetTester .
Este es el contenido de mi archivo / etc / hosts:
127.0.0.1 localhost mac.local
::1 localhost mac.local
En mi caso, mac es el nombre de mi computadora.
La respuesta anterior funciona en mi mac, puedes intentarlo así:
paso 1, descarga inetTester.jar desde la https://github.com/thoeni/inetTester
paso 2, ejecútalo en tu mac. Aquí está el resultado en mi Mac:
$ java -jar ./inetTester.jar
Calling the hostname resolution method...
Method called, hostname MacBook-Pro.local, elapsed time: 5009 (ms)
Se necesitan 5 segundos para ejecutar la prueba, y muestra el nombre de host de mi mac.
paso 3, modifica el / etc / hosts:
127.0.0.1 MacBook-Pro.local
::1 MacBook-Pro.local
el host es lo que se muestra en el paso 2. y después de esto, ejecute la prueba nuevamente:
$ java -jar ./inetTester.jar
Calling the hostname resolution method...
Method called, hostname MacBook-Pro.local, elapsed time: 6 (ms)
Sí, viene con solo 6 ms. 5s -> 6ms, bien.
Sospecho que el retraso aquí se debió a un intento fallido de resolución de DNS. Quizás sus servidores DNS no se configuraron correctamente. Los 30 segundos probablemente representan el tiempo de espera en la resolución DNS.
La razón por la cual su solución mejoró la velocidad es que agregar la entrada al archivo de hosts permitió que el nombre de host se resolviera localmente y, por lo tanto, omita el intento de resolver el nombre de host en un servidor DNS real (remoto).
EDITAR: es posible que se pregunte por qué este método tiene alguna resolución de host. Aparentemente, es parte de un mecanismo anti-spoofing integrado en la biblioteca de red Java. Consulte la respuesta aceptada de esta publicación para obtener más detalles: InetAddress.getCanonicalHostName () devuelve IP en lugar de Hostname