Frage

Wenn ich öffne und eine Buchse durch den Aufruf zum Beispiel schließen

Socket s = new Socket( ... );
s.setReuseAddress(true);
in = s.getInputStream();
...
in.close(); 
s.close();      

Linux heißt es, dass diese Fassung noch offen ist oder zumindest der Dateideskriptor für die Verbindung ist presen. Wenn für diesen Prozess durch lsof die geöffneten Dateien abfragen, gibt es einen Eintrag für die geschlossene Verbindung:

COMMAND  PID   USER   FD   TYPE DEVICE     SIZE   NODE NAME
java    9268 user    5u  sock    0,4           93417 can't identify protocol

Dieser Eintrag bleibt, bis das Programm geschlossen wird. Gibt es eine andere Art und Weise, um schließlich die Steckdose in der Nähe? Ich bin ein wenig besorgt, dass meine Java-Anwendung auf viele Dateideskriptoren blockieren können. Ist das möglich? Oder macht Java diese Buchsen zu halten, um sie wieder zu verwenden, auch ist ReuseAdress eingestellt ist?

War es hilfreich?

Lösung

Wenn diese Buchsen alle im TIME_WAIT-Zustand sind, das ist normal, zumindest für eine kleine Weile. Überprüfen Sie, ob mit netstat; es ist üblich, für Steckdosen für ein paar Minuten zu hängen, um, dass die zurückgebliebenen Daten, um sicherzustellen, aus der Steckdose erfolgreich vor dem Port für eine neue Buchse weggeworfen wird wiederverwendet.

Andere Tipps

Sie können auch /proc/<pid>/fd überprüfen möchten, wird das Verzeichnis alle Ihre aktuell geöffneten Datei-Deskriptoren enthalten. Wenn eine Datei verschwindet, nachdem Sie die Socket geschlossen werden Sie nicht in irgendwelche Probleme laufen (zumindest nicht mit Dateideskriptoren:).

Ich denke, es ist nicht Ihr Programm Problem.

In SUN_Java, wenn Buchse im Zusammenhang nativen lib geladen wird, wird ein MAGIC_SOCK fd erstellt werden.

Schreib auf dem MAGIC_SOCK Willen führte eine Ausnahme Connect Ruhe, und lesen auf dem MAGIC_SOCK Willen führte einen EOF.

der Peer magic_sock wurde vollständig geschlossen und die magic_sock selbst half_closed, und der Staat wird bleiben „kann Protokoll nicht identifizieren“.

Vielleicht ist es eine Buchse aus einem anderen Protokoll ( „identifizieren kann nicht Protokoll“ eh?) Intern in der Implementierung verwendet, um etwas zu tun, die auf der ersten Fassung erstellt werden.

Haben Sie versucht immer wieder Erstellen von Sockets und Schließen sie, um zu sehen, ob diese Buchsen wirklich anhalten? Es scheint wahrscheinlich, dass dies eine einmalige.

Java wahrscheinlich Steckdosen intern für viele Dinge verwendet -. Sie auch sein mag Unix, Netlink (unter Linux) oder eine andere Art von Buchse

Erstellen Sie einen kleinen Bash-Skript geöffnet Sockets für eine bestimmte App oder pid zu überwachen, und laufen lassen, während der Java-Anwendung zu testen.

Ich bezweifle sowieso, dass es irgendeine Art von Lecks in dieser Sache als Steckdosen sehr verwendet in Linux / Unix-Welt und diese Art von Problem würde sprudelt sehr quicky

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top