2013-11-03 120 views
2

我想知道太多文件打开错误的确切问题。我通过谷歌解决方案,但我不明白为什么会出现这个问题,以及如何解决问题。有关ulimit价值的一些事情吗?Tomcat错误太多打开的文件


堆栈错误:重度:套接字接受失败java.net.SocketException异常:打开的文件太多,在java.net.PlainSocketImpl.socketAccept(本机方法)在java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java: 398)at java.net.ServerSocket.implAccept(ServerSocket.java:530)at java.net.ServerSocket.accept(ServerSocket.java:498)at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServer SocketFactory .java:61)at org.apache.tomcat.util.net.JIoEndpoint $ Acceptor.run(JIoEndpoint.java:352) - user2883376昨天

Linux服务器,这是我最后一次更新代码来获取消息在语言上。 ApplicationContext context = new ClassPathXmlApplicationContext(“app-context.xml”); name = context.getMessage(key,null,locale);返回名称;

对此错误有什么建议吗?

+0

它看起来像ulimit的问题。请提供更多详细信息,例如操作系统和错误消息。有没有堆栈错误? – Max

+0

操作系统可能会限制进程可以打开的文件数量。也许你在完成它们之后没有关闭文件? – Henry

+0

堆栈错误:重度:套接字接受失败 java.net.SocketException异常:打开的文件太多 在java.net.PlainSocketImpl.socketAccept(本机方法) 在java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398) 在java.net.ServerSocket.implAccept(ServerSocket.java:530) at java.net.ServerSocket.accept(ServerSocket.java:498) at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java :61) at org.apache.tomcat.util.net.JIoEndpoint $ Acceptor.run(JIoEndpoint.java:352) – user2883376

回答

3

问题几乎可以肯定的是,你正在代码中的某处泄漏文件句柄。我有一次没有遇到这种情况的熬夜数月的雄猫。

+0

如何识别文件泄漏。正如我使用ORM的休眠。是关于JDBC连接的吗?或阅读属性文件? – user2883376

0

虽然如果在tomcat的某一点处引发“ulimit”会停止导致相同的错误。

所以为了避免您可以检查打开的文件列表,使用命令“lsof的-u用户名”,或简称“lsof的” Linux上的应用程序的用户,看看相关的代码文件打开(如..属性文件),如果是的话,使用#kill -9 lsof -t -u username命令杀死那些特定的文件。

您需要修复代码加载这些文件在你的类的静态简单地写。因此,即使任何数量的用户创建了多个匹配,也只会加载一个文件。

现在您可以在使用相同的lsof命令部署新更改后重新检查并查看。只会看到一个文件。这将永久解决您的问题而不会每次提高ulimit。

相关问题