Java 应用程序中的奇怪网络套接字泄漏

SyB*_*Ber 2 java sockets networking memory-leaks

我试图在我们的 Java 守护进程中捕获网络套接字泄漏,它在 lsof 中有一个非常奇怪的输出:

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) 
Run Code Online (Sandbox Code Playgroud)

依此类推,直到它吃掉所有可用的描述符并导致“文件太多”错误。

知道什么会导致这种情况吗?

提前致谢!

use*_*421 5

CLOSE_WAIT意味着连接已被远程对等方关闭,但套接字正在等待本地应用程序关闭它。所以你不会那样做。

您需要检查您是否正确处理了 EOS,即在可能出现的所有情况下关闭套接字,并且IOExceptions在任何套接字操作上也是如此 -除了关闭套接字之外,您必须响应所有这些SocketTimeoutException。您还必须确保套接字在finally块中关闭。