JBoss AS 4.2.3-GA中的打开文件太多异常

时间:2011-07-13 15:25:34

标签: java websocket jmx jboss-4.2.x

我想解决这个问题,我实际上并不清楚当我的应用程序在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 QUEUES,以及一些JMX连接,我想知道如何快速检测问题或者是否是由计算机中的其他组件引起的。有任何建议,请我完全担心这个问题。

2 个答案:

答案 0 :(得分:5)

以下是调试太多打开文件情况的一些提示。可以提供帮助的两个unix命令是ulimitlsof

我建议您man ulimit首先了解您可以更改进程的最大打开文件数。只需在命令行上键入ulimit即可获得ulimit的默认值。例如,对我来说:

$ ulimit
unlimited

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

接下来,lsof -p <pid>将列出ID为&lt; pid&gt;的进程的所有打开文件。

也许你会发现你不是在关注文件时或者你只是打开太多文件(基于极限设置ulimit)?

下一步,您正在运行Java进程,以便在发生Too Many Open Files情况时可以获取进程的线程转储。要获取线程转储,请将进程发送到kill -3 <pid>,或者如果已在当前shell中启动Java进程,则可以键入CTRL-Break以获取线程转储。收集3个或更多线程转储(比如一两分钟)以及从这个线程转储集合中收集特别有用,因此线程转储中存在的线程值得一看。

如果这些都没有帮助您,请搜索“太多打开的文件”。我做了并找到了这个链接,接受的答案可以帮助你

Java Too Many Open Files

答案 1 :(得分:0)

我认为你正在解决这个问题 - AJP connection is left as CLOSE_WAIT