2013-11-03 116 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。

相關問題