2

我想知道打开文件太多错误的确切问题。我通过谷歌寻求解决方案,但我不明白为什么会出现这个问题以及如何解决这个问题。这是关于 ulimit 值的东西吗?


堆栈错误:严重:套接字接受失败 java.net.SocketException:在 java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398) 的 java.net.PlainSocketImpl.socketAccept(Native Method) 处打开的文件太多。 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); 返回名称;

关于这个错误的任何建议?

4

2 回答 2

4

问题几乎可以肯定是您在代码中的某处泄漏了文件句柄。我有 Tomcat 可以一次熬夜几个月而没有遇到这种情况。

于 2013-11-03T07:05:58.447 回答
-2

虽然如果“ulimit”在某个点被提升,tomcat 会停止导致同样的错误。

因此,为了避免这种情况,您可以使用命令“lsof -u username”或简单地“lsof”检查 Linux 上应用程序用户的打开文件列表,并查看代码相关文件是否打开(例如..properties 文件)如果打开那些特定的文件使用 #kill -9lsof -t -u username 命令为特定的 tomcat 用户。

您需要修复您的代码以加载这些文件,这些文件只是在您的类的静态块中编写。这样即使任意数量的用户多次点击,也只会加载一个文件。

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

于 2017-05-05T21:51:34.333 回答