InetAddress.getLocalHost () läuft langsam (30+ Sekunden)

74

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?

imrichardcole
quelle
Sie könnten debuggen, um InetAddress.getLocalHost()zu sehen, wo es die Zeit verbringt
wero
2
Dies ist eine DNS-Fehlkonfiguration. Überprüfen Sie, ob Reverse Lookups ordnungsgemäß funktionieren. Es hat nichts speziell mit Java zu tun. @wero
Marquis von Lorne
Hilft es, IPv6 zu deaktivieren oder auf "Nur lokal" zu setzen? Die JVM führt möglicherweise zuerst eine IPv6-Auflösung durch.
chnrxn
1
Duplikat von stackoverflow.com/questions/39636792/…
Hans Westerbeek
Wenn du seinem Blog folgst, hat er meinen zuerst benutzt :) und auch meine Antwort unten kommentiert.
Imrichardcole

Antworten:

143

Das Problem kann gelöst werden, indem Folgendes hinzugefügt wird /etc/hosts(vorausgesetzt, die hostnameBefehlsausgabe lautet my-macbook:

127.0.0.1   my-macbook
::1         my-macbook

Dies bringt die Zeit auf etwas Passenderes zurück (<1 Sekunde)

imrichardcole
quelle
2
Es funktioniert, und das half mir bei der Fehlersuche :-) ich eine Antwort für ein Problem auf osx sierra hinzugefügt hier und ich erwähnte Ihre Lösung auch auf diesem Blog - Post
thoeni
2
Manchmal ist der Name nicht so offensichtlich. Um ihn herauszufinden, führen Sie zuerst den Befehl hostname aus und ändern Sie dann Ihre Datei / etc / hosts. In meinem Fall war der Name macbooks-MacBook-Air, wie Sie unter 127.0.0.1 localhost macbooks-MacBook- sehen können. Air.local :: 1 localhost macbooks-MacBook-Air.local
Vladimir Stazhilov
Ja, es funktioniert, aber Sie können den Hostnamen localhost beibehalten, wie von Octavian R. in der Antwort unten vorgeschlagen.
Antoine Martin
31

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.

Octavian R.
quelle
Ich habe das Problem mit Intelij, das meine Gradle-App nicht erstellen wollte. Eine bessere Erklärung fand ich auch unter: thoeni.io/post/macos-sierra-java
Yvonne Marggraf
2
Ich denke, mac.localsollte durch den Wert ersetzt werden, der vom hostnameBefehl zurückgegeben wird. Ist das richtig?
stiemannkj1
7

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

bischoje
quelle
6

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.

shilaimuslm
quelle
2

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.

Michael Remme
quelle