我们正在Amazon Linux中的Apache Tomcat中运行Web服务。最初,Web服务正常运行。在发出超过1000个Web请求后,我们收到太多打开文件异常。当我们重新启动tomcat服务器时,这个问题将再次解决。
请在下面找到例外
25-Apr-2016 10:05:52.628 SEVERE [http-nio-8080-Acceptor-0] org.apache.tomcat.util.net.NioEndpoint$Acceptor.run Socket accept failed
java.io.IOException: Too many open files
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:686)
at java.lang.Thread.run(Thread.java:745)
PS:我们没有在Web服务中执行任何与文件相关的操作。
答案 0 :(得分:9)
看起来,打开文件有一些限制。当您在Linux上运行时,我怀疑您的文件描述符已用完。
检查ulimit命令以查看允许打开的文件数。
notificationHolder.checkParentView.setTag(itemsData.ge(position));
notificationHOlder.checkParentView.setOnClickListener(checkedListener);
private View.OnClickListener checkedListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
int positon = (Integer) v.getTag();
}
};
您可以通过编辑来更改打开文件的数量:
ulimit -n
并添加如下内容:
/etc/security/limits.conf
您可以查看有关limits.conf here的更多信息。
默认限制为1024,对某些Java应用程序来说可能太低。
有关增加本文中最大打开文件数的详细信息:http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files/
答案 1 :(得分:3)
这是因为套接字连接被视为文件,因此这意味着您打开了太多连接。检查限制(每个操作系统都有不同的策略 - 每个服务器也一样),可以同时打开多少个端口,等等。您可以使用NIO来限制这些限制。