繁体   English   中英

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

[英]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 QUEUES,以及一些 JMX 连接,我想知道如何快速检测问题,或者这是由计算机中的其他组件引起的。 任何建议,请我完全担心这个问题。

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

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

$ ulimit
unlimited

我在香草 Ubuntu 11.04 发行版上运行,所以看起来无限制是默认设置。 在我的大多数生产机器上,默认值为 1024。

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

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

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

如果这些都对您没有帮助,请在 SO 中搜索“打开的文件过多”。 我做了并找到了这个链接,接受的答案可能会对你有所帮助

Java 打开的文件太多

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM