java sockets - 跟踪应用程序已经创建了多少套接字文件

java sockets - keep track of how many socket files an application already has created

我正在 java 使用套接字编写一个简单的应用程序。我最近 运行 犯了一个错误:

java.net.SocketException: Too many open files

我现在有几个关于套接字的问题:

套接字使用文件句柄,你得到的错误只是意味着你打开了太多的句柄。这可以是任何使用文件句柄的 OS 资源。这并不意味着您的驱动器上某处有文件(实际上没有用于套接字的文件)。

在Windows,您可以在任务管理器的进程视图中查看打开了多少个句柄。只需添加列。

在Java中,关闭资源的责任交给了打开资源的object/process。所以,如果你不打开它,就不要关闭它。如果打开它,请始终关闭它。

自 Java 7 以来的最佳做法是永远不要使用 object.close(),而是将 Closable 接口与

一起使用
try( Socket mySocket = new Socket() ) {
    // code here
}

这保证您的资源将被关闭并且比

更安全和更易读
Socket mySocket = null;
try {
    mySocket = new Socket();
} finally {
   if ( mySocket != null ) mySocket.close();
}

how I could avoid exceptions like this?

  • 确保 socket.close() 总是被调用。从 finally 块中调用 socket.close()
  • 增加最大打开文件限制。
  • socket.close() 并不意味着套接字在关闭后可以立即重用。两次 MSL, since it goes to TIMED_WAIT state after closing. So if a lot of sockets are in TIMED_WAIT state you should consider using a connection pool 后将可重复使用。

how many socket-files my application already has created?

您可以通过 netstat -nalp|grep {pid}|wc 找到它。

what is the limit?

您可以在 linux 中使用 ulimit -n 找到进程可以打开的最大文件数限制。打开的套接字被视为打开的文件。可以通过修改 /etc/security/limits.conf 文件来增加此限制。

does socket.close() method delete the respective socket-file?

是 linux 当为套接字调用 close() 方法时,套接字文件被删除。

where are the socket-files located?

在 linux 中,打开的文件描述符在 /proc/{pid}/fd/ 下。我不确定 windows。