任何 Java 服务器应用程序都可以看到“java.net.SocketException: Too much files open”,例如Tomcat、Weblogic、WebSphere等,客户端连接断开频繁。
请注意套接字连接被视为文件,它们使用文件描述符,这是一种有限的资源。
不同的操作系统对其可以管理的文件句柄数量有不同的限制。
简而言之,这个错误是因为客户端频繁连接和断开连接而出现的。如果您想自己处理它,您有两种选择:
1) 增加每个进程打开的文件句柄或文件描述符的数量。
在基于 UNIX 的操作系统中,例如Ubuntu或Solaris,可以使用命令ulimit -a找出每个进程允许有多少个打开的文件句柄。
$ ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
open files (-n) 256
pipe size (512 bytes, -p) 10
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 2048
virtual memory (kbytes, -v) unlimited
可以看到,打开文件 (-n) 256,这意味着每个进程只允许打开 256 个文件句柄。如果你的Java程序,记住Tomcat,weblogic或任何其他应用服务器都是Java程序并且它们在JVM上运行,超过这个限制,它将抛出java.net.SocketException: Too much files open错误。
您可以使用 ulimit -n 更改此限制为更大的数字,例如4096,但请遵循 UNIX 系统管理员的建议,并且如果您有单独的 UNIX 支持团队,最好升级给他们。
2) 减少操作系统中TIME_WAIT状态的超时
在基于 UNIX 的系统中,您可以在以下位置查看当前配置/proc/sys/net/ipv4/tcp_fin_timeout file.
在基于Windows的系统中,您可以在Windows注册表中看到此信息。您可以按照以下步骤更改 Windows 中的 TCPTIME_WAIT 超时:
1) Open Windows Registry Editor, by typing regedit in run command window
2) Find the key HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\tcpip\Parameters
3) Add a new key value pair TcpTimedWaitDelay asa decimal and set the desired timeout in seconds (60-240)
4) Restart your windows machine.