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?


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


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)


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.


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


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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.