Domanda

Se apro e chiudo un socket chiamando ad esempio

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

Linux afferma che questo socket è ancora aperto o almeno è presente il descrittore di file per la connessione. Quando si esegue una query sui file aperti per questo processo tramite lsof, è presente una voce per la connessione chiusa:

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

Questa voce rimane fino alla chiusura del programma. C'è un altro modo per chiudere finalmente il socket? Sono un po 'preoccupato che la mia applicazione Java possa bloccare molti descrittori di file. È possibile? Oppure Java mantiene questi socket per riutilizzarli anche se ReuseAdress è impostato?

È stato utile?

Soluzione

Se quei socket sono tutti nello stato TIME_WAIT, questo è normale, almeno per un po '. Verificare che con netstat; è comune che i socket restino in giro per alcuni minuti per assicurarsi che i dati sfuggenti dal socket vengano eliminati correttamente prima di riutilizzare la porta per un nuovo socket.

Altri suggerimenti

Potresti anche voler controllare /proc/<pid>/fd, la directory conterrà tutti i descrittori di file attualmente aperti. Se un file scompare dopo aver chiuso il socket non si verificheranno problemi (almeno non con i descrittori di file :).

Penso che non sia un problema per il tuo programma.

In SUN_Java, quando viene caricata la libreria nativa relativa al socket, verrà creato un MAGD_SOCK fd.

scrivere su MAGIC_SOCK avrà come risultato un'eccezione di Rest Connect, e leggere su MAGIC_SOCK produrrà un EOF.

il peer di magic_sock è stato completamente chiuso e lo stesso magic_sock è chiuso a metà e lo stato rimarrà " impossibile identificare il protocollo " ;.

Forse è un socket di qualche altro protocollo (" Impossibile identificare il protocollo " eh?) utilizzato internamente nell'implementazione per fare qualcosa, che viene creato sul primo socket.

Hai provato ripetutamente a creare socket e a chiuderli, per vedere se questi socket persistono davvero? Sembra probabile che si tratti di una tantum.

Probabilmente Java utilizza i socket internamente per molte cose: potrebbero essere Unix, Netlink (sotto Linux) o qualche altro tipo di socket.

Crea un piccolo script bash per monitorare i socket aperti per una determinata app o pid e lascialo funzionare durante il test della tua app java.

Dubito comunque che ci siano tipi di perdite in questa cosa, poiché i socket sono molto usati nel mondo linux / unix e questo tipo di problema si diffonderebbe molto rapidamente

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top