今天遇到两个问题,在系统运行时间太长的情况下,会出现:
的异常,经过查询,问题出在linux中,即使socket也是占用文件句柄的,在大并发访问下,如果系统设置的open files数目太小,JVM就会抛出java.net.SocketException: Too many open files异常。
在几个并发用户连接到服务器之后通常会发生此问题。Java 打开许多文件,以便读取运行应用程序所必需的类。大量应用程序会使用许多文件描述符,这会导致缺乏新的文件描述符。同样,每个新的套接字都需要一个描述符。客户端和服务器通过 TCP 套接字进行通信。在与服务器建立连接时,每个浏览器的 http 请求都使用 TCP 套接字。
一定要首先监视文件描述符并了解这些诊断方法如何告知您有关打开文件的状态和其它潜在问题。在针对操作系统逐步执行此故障排除部分之后,可能有必要增加文件描述符的数量.
解决办法:
1.中策:ulimit -n 32768 扩大ulimit -a的open file限制,一般是1024
2.注意是否在BufferReader中有打开但是没有close的,如果有的话时间长了会占用文件句柄但是不释放,导致问题。
严重: Socket accept failed
java.net.SocketException: Too many open files
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384)
at java.net.ServerSocket.implAccept(ServerSocket.java:453)
at java.net.ServerSocket.accept(ServerSocket.java:421)
at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:61)
at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:310)
at java.lang.Thread.run(Thread.java:619)
的异常,经过查询,问题出在linux中,即使socket也是占用文件句柄的,在大并发访问下,如果系统设置的open files数目太小,JVM就会抛出java.net.SocketException: Too many open files异常。
在几个并发用户连接到服务器之后通常会发生此问题。Java 打开许多文件,以便读取运行应用程序所必需的类。大量应用程序会使用许多文件描述符,这会导致缺乏新的文件描述符。同样,每个新的套接字都需要一个描述符。客户端和服务器通过 TCP 套接字进行通信。在与服务器建立连接时,每个浏览器的 http 请求都使用 TCP 套接字。
一定要首先监视文件描述符并了解这些诊断方法如何告知您有关打开文件的状态和其它潜在问题。在针对操作系统逐步执行此故障排除部分之后,可能有必要增加文件描述符的数量.
解决办法:
1.中策:ulimit -n 32768 扩大ulimit -a的open file限制,一般是1024
2.注意是否在BufferReader中有打开但是没有close的,如果有的话时间长了会占用文件句柄但是不释放,导致问题。