2009-08-04 8 views
8

Hallo Ich habe sehr hässliches Problem mit: java.net.SocketException: Kein Pufferspeicher verfügbar (maximale Verbindungen erreicht?) Es ist Client-Server-App. Client ist Windows XP SP2 32b, mit zwei Netzkarten Kernduo. Java 1.6. u7. Anwendung haben paar Server-Socket offen für die lokale Kommunikation und einige Client-Socket für rmi zu jboss Server.java.net.SocketException: Kein Pufferspeicher verfügbar

Nach ein paar Stunden/Tagen! Ich kann keinen neuen Client-Socket für die Kommunikation mit dem Server öffnen. Server-Sockets funktionieren weiterhin.

Windows Netstat zeigt etwas von 130 bis 150 Verbindung. Beim manuellen Versuch erschöpft Puffer nach ~ 3500 Verbindungen!

Ich versuchte:

  • überprüfen Sie jede Steckdose, die wir verwenden, dass wir auch schließen.
  • laufen netstat im Hintergrund Verbindungen zu überwachen geöffnet
  • Lauf-Virus-Scan alle gefundenen Malware
  • Update Java 1.6 u16
  • disable zweite Netzwerkschnittstelle

  • Sobald Java neu gestartet ich in der Lage bin zu öffnen neue Verbindung.

    Ganz Ausnahme:

     
    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
    Wir endlich das Problem mit fehlerhaft SNMP-Server betroffen. Ich schrieb meine Notizen im Kommentar unten. Danke für die Hilfe.

    +0

    Versuchen Sie http://support.microsoft.com/kb/2577795 –

    Antwort

    1

    Was wir versucht haben (und erfolgreich) das Problem zu töten. JAVA - erneut prüft jede Steckdose wir verwenden, registrieren Sie sie in einiger Sonderklasse benötigt, wenn
    - bietet Socket und ServerSocketFactory für jede Klasse des offene Buchse selbst (zum Beispiel Jboss Connectors)
    - geöffnete Dateien überprüfen, schließen sie schließlich in
    - URL öffnet Verbindung auch, aber wenn Sie nach dem Strom danach fragen, ist die Verbindung zusammen mit Stream geschlossen (danke Stephen).

    OS
    - verwenden verschiedene Java (1.5, 1.6, 1.7)
    - die Installation neuer Treiber
    - Einsatz netstat und überwachen den Verkehr auf Hintergrund (Skripte, ja xp gewinnen ziemlich gut die Skripte tun können). Verwenden Sie bei Bedarf erweiterte Paket-Sniffer (Drahthai?).
    - win xp haben Limit für gleichzeitige Verbindungen, überprüfen Sie sie (Google) zu
    - (! Auch auf privates Netzwerk) überprüfen immer wieder für Viren- und mallware

    3

    Es klingt sicherlich wie Sie Sockets irgendwie in Ihrer App undicht sind.

    • Überprüfen Sie, ob Sie den Code immer die Sockets schließt es ... auch in der Falle einiger Ausnahme öffnet; d.h. schließen die in einem finally Block.
    • Wenn Ihr Code URL-Verbindungen verwendet, stellen Sie sicher, dass die Verbindungen getrennt werden, .
    • Ich bin kein Experte, aber sollte Ihr Code sein InitialContext-Objekt schließen?
    +0

    - guter Punkt mit URL-Verbindungen, ich werde sie erneut überprüfen
    - Ich lese bereits doc für den ersten Kontext und das Schließen es ziemlich irrelevant aussehen. Aber ich werde es versuchen.
    Aber immer noch, warum sehe ich keine Verbindung mit Netstat? – pnemec

    +0

    @pnemec: Basierend auf der Ausnahmebedingungsnachricht könnte es sich um Java-seitige Pufferressourcen handeln, die Sockets zugeordnet sind, die verloren gehen. Dies wird möglicherweise nicht mit Windows Netstat angezeigt. –

    0

    Nach der Beratung in diesem link angeboten lesen! Ich konnte feststellen, dass ich isDisplayed() viel zu oft in zu kurzer Zeit verwendete. Daher habe ich eine Wartezeit von 5 Millisekunden zwischen den Anrufen an isDisplayed gestellt. Dies hat mein Socket Exception-Problem behoben.

    Wie im Link angegeben, sollten Sie einen Versuch fangen, nur für den Fall, dass diese Wartezeit nicht lang genug ist.