2009-08-04 26 views
8

Ciao, ho un problema molto brutto con: java.net.SocketException: Nessuno spazio disponibile sul buffer (connessioni massime raggiunte?) È un'app client-server. Il client è Windows XP SP2 32b, con due core core di rete. Java 1.6. u7. L'applicazione ha un paio di socket del server aperti per la comunicazione locale e un paio di socket client per il server rmi to jboss.Hunt down java.net.SocketException: Spazio buffer non disponibile

Dopo un paio d'ore/giorni! non riesco ad aprire nessun nuovo socket client per fare comunicazione al server. I socket del server funzionano ancora.

Windows netstat mostra qualcosa da 130 a 150 connessione. Quando provo manualmente ho esaurito il buffer dopo ~ 3500 connessioni!

Ho provato:

  • controllare ogni socket che usiamo che lo chiudiamo anche.
  • corsa netstat in background per controllare aperto connessioni
  • scansione antivirus corsa di fondare
  • aggiornamento Java per 1,6 U16 qualsiasi malware
  • seconda rete di disabilitare l'interfaccia

  • volta java viene riavviato io sono in grado di aprire nuova connessione.

    intero Eccezione:

     
    cause:javax.naming.CommunicationException: Failed to connect to server IP:1099 [Root exception is javax.naming.ServiceUnavailableException: Failed to connect to server IP:1099 [Roo 
    t exception is java.net.SocketException: No buffer space available (maximum connections reached?): JVM_Bind]] 
    2009-08-03 09:13:18,968 DEBUG [Thread-9] - stack trace: 
    2009-08-03 09:13:18,968 DEBUG [Thread-9] - org.jnp.interfaces.NamingContext.checkRef(NamingContext.java:1562) 
    2009-08-03 09:13:18,968 DEBUG [Thread-9] - org.jnp.interfaces.NamingContext.lookup(NamingContext.java:634) 
    2009-08-03 09:13:18,968 DEBUG [Thread-9] - org.jnp.interfaces.NamingContext.lookup(NamingContext.java:627) 
    2009-08-03 09:13:18,968 DEBUG [Thread-9] - javax.naming.InitialContext.lookup(Unknown Source) 
    

    --edited
    Abbiamo finalmente raggiunto il problema con il server SNMP malfunzionamento. Ho scritto le mie note nel commento qui sotto. Grazie per l'aiuto.

    +0

    Prova http://support.microsoft.com/kb/2577795 –

    risposta

    1

    Cosa abbiamo provato (e con successo) a eliminare il problema. JAVA - prova di nuovo ogni presa che abbiamo usato, registrarli in qualche classe speciale, se necessario
    - fornire SocketFactory e ServerSocketFactory per ogni classe che socket aperto stesso (ad esempio JBoss Connettori)
    - controllare i file aperti, chiuderli in fine
    - L'URL apre anche la connessione, ma se chiedi lo streaming dopo, la connessione viene chiusa insieme allo streaming (grazie Stephen).

    OS
    - usare Java diverso (1.5, 1.6, 1.7)
    - installare nuovi driver
    - uso netstat e monitorare il traffico su sfondo (utilizzando script, sì Win XP può fare gli script abbastanza bene). Utilizzare avanzati sniffer di pacchetti (wire squalo?) Se necessario.
    - Win XP hanno limite per le connessioni simultanee, check them (google) troppo
    - (! Anche su rete privata) prova di nuovo e di nuovo per il virus e mallware

    3

    Sembra proprio che tu stia perdendo socket in qualche modo nella tua app.

    • Verificare che il codice si chiude sempre le prese di corrente che apre ... anche in caso di qualche eccezione; Ad esempio, lo chiude in un blocco finally.
    • Se il codice utilizza connessioni URL, assicurarsi che vengano disconnessi.
    • Non sono un esperto, ma il codice dovrebbe chiudere il suo oggetto InitialContext?
    +0

    - buon punto con i collegamenti URL, farò ricontrollare loro
    - ho già letto doc per contesto iniziale e la chiusura sembrare abbastanza irrilevante. Ma farò un tentativo.
    Ma ancora perché sto vedendo qualche connessione usando netstat? – pnemec

    +0

    @pnemec: in base al messaggio di eccezione, potrebbe trattarsi di risorse del buffer sul lato Java associate a socket che vengono persi. Questo potrebbe non apparire con Windows netstat. –

    0

    Dopo aver letto i consigli offerti in questo link! Sono stato in grado di determinare che stavo usando isDisplayed() troppo spesso in poco tempo. Pertanto, ho inserito un'attesa di 5 millisecondi tra le chiamate a isDisplayed. Questo ha risolto il mio problema di Socket Exception.

    for (final WebElement person: persons){ 
         if (person.isDisplayed()){ 
          dosomething; 
          sleep 5 milliseconds 
         } 
        } 
    

    Come indicato nel link si dovrebbe inserire un tentativo di cattura nel caso in cui questa attesa non è abbastanza lungo.

    Problemi correlati