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

Mad*_*666 0 java jmx websocket 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)
Run Code Online (Sandbox Code Playgroud)

日志开始快速增长...我在我的应用程序中使用了一些JBOSS QUEUES,以及一些JMX连接,我想知道如何快速检测问题或者是否由计算机中的其他组件引起.有任何建议,请我完全担心这个问题.

mrk*_*mrk 5

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

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

$ ulimit
unlimited
Run Code Online (Sandbox Code Playgroud)

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

接下来,lsof -p <pid>将列出id为<pid>的进程的所有打开文件.

也许您会发现,当您认为自己或者只是打开太多文件(基于极限设置ulimit)时,您要么不关闭文件?

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

如果这些都不能帮助您,请搜索"太多打开的文件".我做了并找到了这个链接,接受的答案可能对你有帮助

Java太多打开文件