如果我通过调用打开和关闭套接字
Socket s = new Socket( ... );
s.setReuseAddress(true);
in = s.getInputStream();
...
in.close();
s.close();
Linux 声明此套接字仍处于打开状态,或者至少存在连接的文件描述符。用lsof查询这个进程打开的文件时,有一个关闭连接的入口:
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
java 9268 user 5u sock 0,4 93417 can't identify protocol
此条目将一直保留到程序关闭为止。还有其他方法可以最终关闭套接字吗? 我有点担心我的 java 应用程序可能会阻塞许多文件描述符。这可能吗?或者即使设置了 ReuseAdress,java 是否保留这些套接字以重新使用它们?
最佳答案
如果那些套接字都处于TIME_WAIT状态,这是正常的,至少有一小段时间是这样。用 netstat 检查一下;套接字通常会挂起几分钟,以确保在为新套接字重新使用端口之前成功丢弃来自套接字的散乱数据。
关于java - 在 linux 平台上使用套接字时是否存在文件描述符泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/429762/