2009-08-04 21 views
8

Xin chào, tôi có vấn đề rất xấu với: java.net.SocketException: Không có vùng đệm (kết nối tối đa đạt được?) Đây là ứng dụng máy khách. Khách hàng là Windows XP SP2 32b, với hai bộ đôi net card lõi. Java 1.6. u7. Ứng dụng có vài cổng máy chủ mở cho giao tiếp cục bộ và vài ổ cắm máy khách cho máy chủ rmi đến jboss.Tìm hiểu về java.net.SocketException: Không có vùng đệm nào có sẵn

Sau vài giờ/ngày! tôi không thể mở bất kỳ ổ cắm máy khách mới nào để giao tiếp với máy chủ. Ổ cắm máy chủ vẫn hoạt động.

Windows netstat hiển thị nội dung nào đó từ 130 đến 150 kết nối. Khi tự thử tôi đã cạn kiệt bộ đệm sau ~ 3500 kết nối!

Tôi đã thử:

  • kiểm tra mọi ổ cắm chúng tôi sử dụng để chúng tôi cũng đóng.
  • chạy netstat tại nền để giám sát mở các kết nối
  • chạy quét virus để tìm thấy bất kỳ phần mềm độc hại
  • cập nhật java 1,6 U16
  • mạng thứ hai vô hiệu hóa giao diện

  • Khi java được khởi động lại tôi có thể mở kết nối mới.

    Tổng số ngoại lệ:

     
    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
    cuối cùng Chúng tôi nhấn các vấn đề với máy chủ snmp hư hỏng. Tôi đã viết ghi chú của tôi trong bình luận dưới đây. Cảm ơn vì sự giúp đỡ.

    +0

    Hãy thử http://support.microsoft.com/kb/2577795 –

    Trả lời

    1

    Những gì chúng tôi đã thử (và thành công) sẽ xóa sự cố. JAVA - kiểm tra lại tất cả các ổ cắm chúng tôi sử dụng, đăng ký chúng trong một số lớp học đặc biệt nếu cần
    - cung cấp SocketFactory và ServerSocketFactory cho mỗi lớp mà mở ổ cắm riêng của mình (ví dụ JBoss Connectors)
    - kiểm tra các tập tin mở ra, đóng chúng trong cuối cùng
    - URL cũng mở kết nối, nhưng nếu bạn yêu cầu luồng sau đó, kết nối sẽ bị đóng cùng với luồng (nhờ Stephen).

    OS
    - sử dụng java khác nhau (1.5, 1.6, 1.7)
    - cài đặt trình điều khiển mới
    - sử dụng netstat và giám sát giao thông trên nền (sử dụng các kịch bản, có win xp có thể thực hiện các kịch bản khá độc đáo). Sử dụng các gói sniffers nâng cao (dây cá mập?) Nếu cần.
    - win xp có giới hạn cho các kết nối đồng thời, kiểm tra xem chúng (google) quá
    - (! Ngay cả trên mạng riêng) kiểm tra một lần nữa và một lần nữa cho virus và mallware

    3

    Chắc chắn có vẻ như bạn đang làm rò rỉ Ổ cắm bằng cách nào đó trong ứng dụng của bạn.

    • Kiểm tra mã của bạn luôn đóng Ổ cắm mở ra ... ngay cả trong sự kiện của một số ngoại lệ; tức là làm đóng trong một khối finally.
    • Nếu mã của bạn sử dụng kết nối URL, hãy đảm bảo rằng chúng bị ngắt kết nối.
    • Tôi không phải là chuyên gia, nhưng mã của bạn có nên đóng đối tượng InitialContext không?
    +0

    - điểm tốt với kết nối URL, tôi sẽ kiểm tra lại chúng
    - Tôi đã đọc tài liệu về ngữ cảnh ban đầu và đóng tài liệu trông khá không liên quan. Nhưng tôi sẽ thử.
    Nhưng tại sao tôi lại thấy bất kỳ kết nối nào bằng netstat? – pnemec

    +0

    @pnemec: Dựa trên thông báo ngoại lệ, nó có thể là tài nguyên đệm bên Java được kết hợp với Ổ cắm bị mất. Điều này có thể không hiển thị với Windows netstat. –

    0

    Sau khi đọc những lời khuyên được cung cấp trong link này! Tôi đã có thể xác định rằng tôi đã sử dụng isDisplayed() cách quá thường xuyên trong quá ngắn của một thời gian. Do đó, tôi đã đặt thời gian chờ là 5 mili giây giữa các cuộc gọi đến isDisplayed. Điều này đã khắc phục sự cố Ổ cắm ngoại lệ của tôi.

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

    Như đã nêu trong liên kết, bạn nên thử bắt trong trường hợp chờ đợi này không đủ dài.

    Các vấn đề liên quan