java sockets - 跟踪应用程序已经创建了多少套接字文件
java sockets - keep track of how many socket files an application already has created
我正在 java 使用套接字编写一个简单的应用程序。我最近 运行 犯了一个错误:
java.net.SocketException: Too many open files
我现在有几个关于套接字的问题:
我开始想知道如何避免这样的异常?因此,我如何跟踪我的应用程序已经创建了多少个套接字文件?限制是多少?
另外,我的假设是否正确,socket.close()
方法删除了相应的套接字文件?
套接字文件位于何处?这个问题是否取决于我使用的操作系统?因为在 Linux 中我知道套接字是用文件处理的(就像几乎所有其他东西一样),但我不知道 windows 等
套接字使用文件句柄,你得到的错误只是意味着你打开了太多的句柄。这可以是任何使用文件句柄的 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。
我正在 java 使用套接字编写一个简单的应用程序。我最近 运行 犯了一个错误:
java.net.SocketException: Too many open files
我现在有几个关于套接字的问题:
我开始想知道如何避免这样的异常?因此,我如何跟踪我的应用程序已经创建了多少个套接字文件?限制是多少?
另外,我的假设是否正确,
socket.close()
方法删除了相应的套接字文件?套接字文件位于何处?这个问题是否取决于我使用的操作系统?因为在 Linux 中我知道套接字是用文件处理的(就像几乎所有其他东西一样),但我不知道 windows 等
套接字使用文件句柄,你得到的错误只是意味着你打开了太多的句柄。这可以是任何使用文件句柄的 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。