2009-08-04 9 views
8

Witam Mam bardzo brzydki problem z: java.net.SocketException: Brak dostępnego miejsca buforowego (osiągnięto maksymalne połączenia?) Jest to aplikacja klient-serwer. Klientem jest Windows XP SP2 32b, z dwoma duetami kart sieciowych. Java 1.6. u7. Aplikacja ma gniazdo serwera para otwarte dla lokalnej komunikacji i kilka gniazd klienta dla rmi do serwera jboss.Wyłapywanie java.net.SocketException: brak dostępnej przestrzeni buforowej

Po kilku godzinach/dniach! Nie mogę otworzyć żadnego nowego gniazda klienta do komunikacji z serwerem. Gniazda serwera nadal działają.

Windows netstat pokazuje coś ze 130 do 150 połączeń. Podczas ręcznego próbowania wyczerpałem bufor po ~ 3500 połączeniach!

Próbowałem:

  • sprawdź każde gniazdo, którego używamy, a także je zamykamy.
  • prowadzony netstat na tle monitorować otwarte przyłączy
  • wirusów prowadzony skanowanie, aby znaleźć żadnych szkodliwych
  • aktualizacja java do 1,6 u16
  • wyłączyć drugi interfejs sieciowy

  • Po java zostaje wznowiona jestem w stanie otworzyć nowe połączenie.

    Cały Wyjątek:

     
    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
    W końcu trafić na problem z nieprawidłowego działania serwera SNMP. Napisałem swoje notatki w komentarzu poniżej. Dzięki za pomoc.

    +0

    Spróbuj http://support.microsoft.com/kb/2577795 –

    Odpowiedz

    1

    To, czego próbowaliśmy (i skutecznie) zabiliśmy. JAVA - ponownie sprawdzić każde gniazdo użyliśmy, zarejestrować je w jakiejś specjalnej klasy w razie potrzeby
    - zapewnić SocketFactory i ServerSocketFactory dla każdej klasy, które otwierają sobie gniazdko (na przykład JBoss złącz)
    - sprawdź otwieranych plików, zamknąć je w końcu
    - URL również otwiera połączenie, ale jeśli poprosisz o strumień po tym, połączenie zostanie zamknięte razem ze strumieniem (dzięki Stephen).

    OS
    - użyć innego języka Java (1.5, 1.6, 1.7)
    - zainstalować nowe sterowniki
    - Używaj netstat i monitorowanie ruchu w tle (przy użyciu skryptów, tak Win XP można robić skrypty całkiem ładnie). W razie potrzeby korzystaj z zaawansowanych snifferów pakietów (drutu rekina?).
    - Win XP mają limit jednoczesnych połączeń, sprawdź je (Google) zbyt
    - (! Nawet w sieci prywatnej) sprawdzić ponownie i ponownie dla wirusów i mallware

    3

    Z pewnością brzmi to tak, jakbyś przeciekał gniazda w swojej aplikacji.

    • Sprawdź, czy Twój kod zawsze zamyka gniazd to otwiera ... nawet w przypadku jakiegoś wyjątku; tj. zamknij blok w bloku finally.
    • Jeśli twój kod używa połączeń URL, upewnij się, że zostaną rozłączone.
    • Nie jestem ekspertem, ale czy twój kod powinien zamknąć obiekt InitialContext?
    +0

    - dobry punkt z przyłączami URL, będę ponownie sprawdzić ich
    - Już odczytać doc dla początkowego kontekstu i zamykania wyglądać całkiem nieistotne. Ale spróbuję.
    Ale wciąż dlaczego nie widzę żadnego związku za pomocą netstat? – pnemec

    +0

    @pnemec: Na podstawie komunikatu wyjątku mogą to być zasoby bufora po stronie Java powiązane z utraconymi gniazdami. To może nie pojawić się w systemie Windows Netstat. –

    0

    Po przeczytaniu porady oferowane w tym link! Byłem w stanie stwierdzić, że używam isDisplayed() zbyt często w zbyt krótkim czasie. Dlatego umieściłem 5 milisekundową przerwę między wywołaniami do funkcji isDisplayed. Naprawiono problem z wyjątkiem Socket.

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

    Jak stwierdzono w linku, należy wstawić próbkę catch na wypadek, gdy oczekiwanie nie trwa wystarczająco długo.

    Powiązane problemy