2010-12-19 59 views
2

我想趕上我們的Java後臺網絡套接字泄漏,這在lsof的相當奇怪的輸出:奇怪的網絡套接字泄漏Java應用程序

java 11734 root 463u IPv6   225927527    TCP 192.168.254.1:http->192.168.254.1:46149 (CLOSE_WAIT) 
java 11734 root 464u IPv6   225927347    TCP 192.168.254.1:http->192.168.254.1:46102 (CLOSE_WAIT) 
java 11734 root 465u IPv6   225928791    TCP 192.168.254.1:http->192.168.254.1:46451 (CLOSE_WAIT) 
java 11734 root 466u IPv6   225927617    TCP 192.168.254.1:http->192.168.254.1:46170 (CLOSE_WAIT) 
java 11734 root 467u IPv6   225930330    TCP 192.168.254.1:http->192.168.254.1:57333 (CLOSE_WAIT) 

依此類推,直到它吃所有的可用的描述符並導致「文件太多」錯誤。

任何想法可能導致此?

在此先感謝!

+2

CLOSE_WAIT表示被動關閉,即服務器從客戶端接收到FIN,但沒有發生其他事情。您可以檢查客戶端如何關閉套接字。這似乎是「關機」調用沒有關閉,但我不知道。 – khachik 2010-12-19 18:59:13

+0

我們確實有一種機制可以自我檢測端口是否打開,並且我認爲泄漏存在,但是在仔細檢查之後,它似乎正確地關閉了這些套接字。 – SyBer 2010-12-19 18:59:50

+0

你真的關閉你的客戶端套接字嗎? – 2010-12-19 19:07:04

回答

3

CLOSE_WAIT表示連接已被遠程對等關閉,但套接字正在等待本地應用程序關閉它。所以你不這樣做。

你需要檢查你處理EOS得當,通過關閉套接字,在那裏它可能出現的所有情況,即,並且同上IOExceptions任何套接字操作 - 你必須通過關閉至他們的所有迴應,除了SocketTimeoutException插座。您還必須確保finally區塊中的插座已關閉。

+0

最終模塊是票據,它出現在我的客戶端套接字正常關閉的情況下,服務器端(相同的自我監控部分)一直處於打開狀態,直到被GC捕獲。 – SyBer 2010-12-20 10:06:36

+0

@naXa'EOFException'是一個EOS,但不是所有的EOS都是'EOFExceptions'。如果我的意思是'EOFException',我會寫它。 – EJP 2018-01-15 22:19:07