2

突然、システムで以下のエラーが発生しました。原因: java.io.FileNotFoundException: /web/wasapps/EventLog.log (開いているファイルが多すぎます)

閉じられていないファイルがいくつかあると想定していますが、リークの原因となっている Java ファイルを見つけることができません。これについて私を助けてください..

アンリミテッドセットは以下の通りです。

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 
4

1 に答える 1

0

jstack ( http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstack.html ) も、問題の原因を特定するのに役立ちます。lsofpid が表示され、実行jstack < pid >してすべてのスレッドのスタック トレースをダンプできます。どこかのループでファイルを開いていると仮定すると、いくつかの jstack を取得すると、どこにあるかを示すスタックをキャッチする可能性があります。

もう 1 つの解決策は、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();
    }
};
于 2013-03-07T23:25:20.157 に答える