2010-12-19 33 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