java.io.IOException: 打开的文件过多(Too many open files)

一、环境描述:

        部署到linux下的tomcat

二、现象:

        刚部署完后可以对项目进行访问,后台没有报错,间隔两天后,无法访问项目,日志中报错。

三、错误日志如下:

20-Nov-2017 10:07:15.210 SEVERE [http-nio-8081-Acceptor-0]org.apache.tomcat.util.net.NioEndpoint$Acceptor.run Socket acceptfailed
java.io.IOException: 打开的文件过多(Too many open files)
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
at un.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
at un.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:687)
at java.lang.Thread.run(Thread.java:748)

四、报错的原因是:

        项目中有七八个定时器,其中有一个定时器是每半小时执行一次,定时器任务是使用ssh方式登录linux服务进行相应的操作,而问题恰恰就在没有关闭定时器每次执行时创建的“ch.ethz.ssh2.Connection” 连接器对象实例,造成了"Too manyopen files "。

五、解决方案: 对Connection对象使用完后进行关闭。

        在解决这个问题的过程中,看到网上很多帖子都是在说设置linux的最大文件打开数量,至于说怎么设置,在这里就不说了,反正这个方法无法根本解决问题。我还是说一下程序中存在的BUG问题,在写代码的时候往往就会粗心的忘记对Connection、Session、Socket、节点流和处理流等进行关闭操作,而linux下对文件操作数量有限制,当超过默认的最大打开文件数量1024个时,就会报Too many open files错误。

你可能感兴趣的:(java)