java - 打开的文件太多<如何查找导致泄漏的java文件>

标签 java unix

突然之间,我们在系统中遇到了以下错误。 引起:java.io.FileNotFoundException:/web/wasapps/EventLog.log(打开的文件太多)

我假设有一些文件没有关闭,但我无法找到导致泄漏的 java 文件。请帮我解决这个问题..

Unlimit 设置如下:

time(seconds)        unlimited
file(blocks)         unlimited
data(kbytes)         unlimited
stack(kbytes)        unlimited
memory(kbytes)       32768
coredump(blocks)     unlimited
nofiles(descriptors) 2000
threads(per process) unlimited
processes(per user)  unlimited

堆栈跟踪:

SystemErr R 原因:java.io.FileNotFoundException: /web/wasapps/EventLog.log(打开的文件太多)

at java.io.FileOutputStream.openAppend(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:203)
at java.io.FileOutputStream.<init>(FileOutputStream.java:128)
at com.abc.ci.common.LogManager.writeIntoFile(Unknown Source)
at com.abc.ci.common.LogManager.writeLogFile(Unknown Source)
at com.abc.ci.common.LogManager.handleEvent(Unknown Source)
at com.abc.ci.RANdc.common.CIFAdapter.postRequestForHashMap(Unknown Source)
at com.abc.ci.RANdc.UserInqDataTranslator.translate(Unknown Source)
at com.abc.ci.RANdc.UserInqProcessor.UserInq(UserInqProcessor.java:187)
at com.abc.ci.RANdc.srvprov.UserInqXYHostSrvProv.executeService(Unknown Source)
at com.abc.fiapi.common.XYHostServiceExecutor.execute(Unknown Source)
at com.abc.ci.RAN.ejb.RANModuleEJBBean.executeService(Unknown Source)
at com.abc.ci.srvprov.FRANModuleBeanLookUpServiceProvider.executeService(Unknown Source)
at com.abc.ci.abc.app.abcServiceExecutor.executeService(Unknown Source)
at com.abc.ci.abc.app.abcMessageExecutor.executeService(Unknown Source)
at com.abc.ci.abc.app.abcMessageExecutor.executeMessage(Unknown Source)
at com.abc.ci.abc.app.abcSyncMessageExecutor.processMessage(Unknown 

最佳答案

jstack ( http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstack.html ) 也可以帮助确定这里的问题所在。 lsof会给你 pid,你可以运行 jstack < pid >转储所有线程的堆栈跟踪。假设您在某处循环打开文件,您可能会看到一个堆栈,该堆栈显示如果您进行了一些 jstack。

另一个解决方案是使用类似 JMockit ( http://jmockit.googlecode.com ) 的东西来模拟 FileOutputStream 构造函数,以便在文件打开时转储堆栈。只需将此代码添加到您的主要方法中:

final String TARGET_FILE = "/web/wasapps/EventLog.log";
new MockUp<FileOutputStream>()
{
    @Mock
    public $init(Invocation i, String name)
    {
        if (name.equals(TARGET_FILE))
        {
            new Exception().printStackTrace();
        }

        i.proceed();
    }
};

关于java - 打开的文件太多<如何查找导致泄漏的java文件>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12309620/

相关文章:

java - 如何使用 Java API 确定文件是 32 位还是 64 位?

c - UNIX 风格的套接字编程技巧

java - 使用 Java 导入 SQL

java - 如何使用 Java Applet 从客户端电脑获取文本字体?

读取管道后 bash 返回代码

linux - 如何从字符串中将数字读入变量

unix - 如何使用 wget --convert-links

c - 确定 fork 后的内存是否为写时复制

JavaFX - 为整个应用程序设置默认 CSS 样式表

java - Selenium 在打开新选项卡时抛出 IndexOutOfBoundsException