Too many open files Exception in JBoss AS 4.2.3-GA



我想解决这个问题,我实际上不清楚发生了什么当我的应用程序在CentOs环境中运行,几天后我开始得到以下例外:

2011-07-12 21:58:03,598 12155907 ERROR [org.jboss.naming.Naming] (JBoss System Threads(1)-2:) Naming accept handler stopping
java.net.SocketException: Too many open files
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
    at java.net.ServerSocket.implAccept(ServerSocket.java:462)
    at java.net.ServerSocket.accept(ServerSocket.java:430)
    at org.jnp.server.Main$AcceptHandler.run(Main.java:481)
    at org.jboss.util.threadpool.RunnableTaskWrapper.run(RunnableTaskWrapper.java:148)
    at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:756)
    at java.lang.Thread.run(Thread.java:662)
2011-07-12 21:58:03,600 12155909 ERROR [org.jboss.naming.Naming] (JBoss System Threads(1)-2:) Naming accept handler stopping
java.net.SocketException: Too many open files
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
    at java.net.ServerSocket.implAccept(ServerSocket.java:462)
    at java.net.ServerSocket.accept(ServerSocket.java:430)
    at org.jnp.server.Main$AcceptHandler.run(Main.java:481)
    at org.jboss.util.threadpool.RunnableTaskWrapper.run(RunnableTaskWrapper.java:148)
    at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:756)
    at java.lang.Thread.run(Thread.java:662)
2011-07-12 21:58:03,600 12155909 ERROR [org.jboss.naming.Naming] (JBoss System Threads(1)-2:) Naming accept handler stopping
java.net.SocketException: Too many open files
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
    at java.net.ServerSocket.implAccept(ServerSocket.java:462)
    at java.net.ServerSocket.accept(ServerSocket.java:430)
    at org.jnp.server.Main$AcceptHandler.run(Main.java:481)
    at org.jboss.util.threadpool.RunnableTaskWrapper.run(RunnableTaskWrapper.java:148)
    at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:756)
    at java.lang.Thread.run(Thread.java:662)
2011-07-12 21:58:03,601 12155910 ERROR [org.jboss.naming.Naming] (JBoss System Threads(1)-2:) Naming accept handler stopping
java.net.SocketException: Too many open files
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
    at java.net.ServerSocket.implAccept(ServerSocket.java:462)
    at java.net.ServerSocket.accept(ServerSocket.java:430)
    at org.jnp.server.Main$AcceptHandler.run(Main.java:481)
    at org.jboss.util.threadpool.RunnableTaskWrapper.run(RunnableTaskWrapper.java:148)
    at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:756)
    at java.lang.Thread.run(Thread.java:662)

原木开始快速生长…我在我的应用程序中使用一些JBOSS队列,以及一些JMX连接,我想知道如何快速检测问题,或者这是否是由计算机中的其他组件引起的。我很担心这个问题

这里有一些调试打开文件过多情况的技巧。可以提供帮助的两个unix命令是:ulimitlsof

我建议您首先使用man ulimit来了解您可以更改进程的最大打开文件数。只需在命令行中输入ulimit,就会得到ulimit的默认值。例如,对我来说:

$ ulimit
unlimited

我正在运行一个普通的Ubuntu 11.04发行版,所以看起来无限制是默认的。在我的大多数生产设备上,默认值是1024。

下一步是lsof -p <pid>,它将列出id为的进程的所有打开的文件。

也许你会发现你没有关闭文件,或者你只是打开了太多的文件(基于设置的限制ulimit)?

下一步,您正在运行一个Java进程,因此您可以在发生过多打开文件的情况时获得进程的线程转储。要获得线程转储,可以向进程发送一个kill -3 <pid>,或者如果在当前shell中启动了Java进程,可以键入CTRL-Break来获得线程转储。在一分钟或两分钟内收集3个或更多的线程转储是特别有帮助的,并且从这个线程转储集合中收集,因此线程转储中存在的线程值得一看。

如果这些都没有帮助你,搜索SO搜索"太多打开的文件"。我找到了这个链接,这个公认的答案可能会对你有所帮助

Java Too Many Open Files

我认为您遇到了这个问题- AJP连接保留为CLOSE_WAIT

最新更新