Mit folgendem Code:
try {
System.out.println(new Date());
InetAddress hostName = InetAddress.getLocalHost();
System.out.println(new Date());
} catch (UnknownHostException e) {
e.printStackTrace();
}
Ich bekomme diese Ausgabe:
Thu Oct 22 20:58:22 BST 2015
Thu Oct 22 20:58:52 BST 2015
Mit anderen Worten 30 Sekunden zur Ausführung. Maschine ist 2015 Macbook Pro mit Java 1.8.0_60.
Warum dauert das so lange?
InetAddress.getLocalHost()
zu sehen, wo es die Zeit verbringtAntworten:
Das Problem kann gelöst werden, indem Folgendes hinzugefügt wird
/etc/hosts
(vorausgesetzt, diehostname
Befehlsausgabe lautetmy-macbook
:127.0.0.1 my-macbook ::1 my-macbook
Dies bringt die Zeit auf etwas Passenderes zurück (<1 Sekunde)
quelle
Dieses Problem tritt unter MacOS Sierra unter Verwendung von Java8 auf. Aktualisierungen sind gleich oder größer als 60 (jdk1.8.0_60.jdk, jdk1.8.0_77.jdk usw.).
Die Lösung finden Sie hier: https://github.com/thoeni/inetTester .
Dies ist der Inhalt meiner Datei / etc / hosts:
127.0.0.1 localhost mac.local ::1 localhost mac.local
In meinem Fall ist mac mein Computername.
quelle
mac.local
sollte durch den Wert ersetzt werden, der vomhostname
Befehl zurückgegeben wird. Ist das richtig?Ich vermute, dass die Verzögerung hier auf einen fehlgeschlagenen Versuch der DNS-Auflösung zurückzuführen ist. Möglicherweise wurden Ihre DNS-Server nicht richtig konfiguriert. Die 30 Sekunden stellen wahrscheinlich das Zeitlimit für die DNS-Auflösung dar.
Der Grund, warum Ihre Lösung die Geschwindigkeit verbessert hat, besteht darin, dass durch Hinzufügen des Eintrags zur Hosts-Datei der Hostname lokal aufgelöst werden konnte und somit der Versuch übersprungen wird, den Hostnamen gegen einen tatsächlichen (Remote-) DNS-Server aufzulösen.
BEARBEITEN: Sie fragen sich vielleicht, warum diese Methode überhaupt eine Hostauflösung durchführt. Anscheinend ist es Teil eines Anti-Spoofing-Mechanismus, der in die Java-Netzwerkbibliothek integriert ist. Weitere Informationen finden Sie in der akzeptierten Antwort dieses Beitrags: InetAddress.getCanonicalHostName () gibt IP anstelle von Hostname zurück
quelle
Die obige Antwort funktioniert auf meinem Mac. Sie können sie folgendermaßen ausprobieren:
Schritt 1: Laden Sie inetTester.jar von der Linkbeschreibung hier herunter
Schritt 2, führen Sie es auf Ihrem Mac aus. Hier ist das Ergebnis auf meinem Mac:
$ java -jar ./inetTester.jar Calling the hostname resolution method... Method called, hostname MacBook-Pro.local, elapsed time: 5009 (ms)
Das Ausführen des Tests dauert 5 Sekunden und zeigt den Hostnamen meines Mac an.
Schritt 3: Ändern Sie die Datei / etc / hosts:
127.0.0.1 MacBook-Pro.local ::1 MacBook-Pro.local
Der Host wird in Schritt 2 angezeigt. Führen Sie anschließend den Test erneut aus:
$ java -jar ./inetTester.jar Calling the hostname resolution method... Method called, hostname MacBook-Pro.local, elapsed time: 6 (ms)
Ja, es kommt mit nur 6ms. 5s -> 6ms, schön.
quelle
Auf einem MacBook Pro mit Java 1.8.0_92 und 1.80_112 besteht dieses Problem weiterhin. Der Aufruf von InetAddress.getLocalhost () dauert> 5 Sekunden. Die Lösung mit den geänderten / etc / hosts funktioniert nicht. Nur ein Zurückschalten auf Java 1.8.0_051 löst dieses Problem.
quelle