我想解决这个问题,实际上我不清楚当我的应用程序在 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 命令是 ulimit
和lsof
我建议你man ulimit
首先要了解您可以更改进程的最大打开文件数。只需输入 ulimit
命令行上将为您提供 ulimit 的默认值。以我为例:
$ ulimit
unlimited
我在普通的 Ubuntu 11.04 发行版上运行,所以看起来默认是无限制的。在我的大多数生产机器上,默认值为 1024。
下一步,lsof -p <pid>
这将列出 ID 为
也许您会发现您要么没有像您想象的那样关闭文件,要么只是打开了太多文件(基于设置的 ulimit 限制)?
下一步,您将运行一个 Java 进程,以便在发生“打开文件过多”情况时获取进程的线程转储。要获取线程转储,请向进程发送 kill -3 <pid>
或者,如果您已在当前 shell 中启动 Java 进程,则可以键入 CTRL-Break 来获取线程转储。在(比如说一两分钟内)从这个线程转储集合中收集 3 个或更多线程转储特别有帮助,因此线程转储中存在的线程值得一看。
如果这些都对您没有帮助,请搜索“太多打开的文件”。我找到了这个链接,接受的答案可能会对您有所帮助
关于java - JBoss AS 4.2.3-GA 中打开文件过多异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6681363/