3
 Compilefile.this.compileThread = new Thread() {
    @Override
    public void run() {
        try {
            synchronized (this) {
                Application.getDBHandler().setAutoCommit(false);
                MIBParserUtils.getDefaultMibsMap();
                compileSelectedFiles();
                Application.getDBHandler().CommitTrans();
                Application.getDBHandler().setAutoCommit(true);
            }
        }
        catch(OutOfMemoryError exp) {
            JOptionPane.showMessageDialog(null, "Compilation Stopped.. Insufficient Memory!!!");
            CompileMib.this.compileThread.interrupt();
            System.gc();

            dispose();
            NmsLogger.writeDebugLog(exp);   
        }
        finally {
        }
    }

スレッド内でいくつかのファイルをコンパイルしようとしました。UI は、コンパイルする 200 を超えるファイルを選択します。コンパイル中OutOfMemoryErrorに、Eclipse のメモリ不足が原因でエラーが発生しました。スレッドを停止してメッセージ ボックスを表示し、アプリケーションでコンパイル ウィンドウを破棄したいと考えています。以下のコードを書きましたが、うまくいきません。例外をキャッチして処理できますか、それともより良い解決策がありますか?

4

3 に答える 3

1

catch ブロックで例外を処理できますか?

OOMEを確実に捕まえることができます。しかし、正常に回復することはまったく別のことです。この回答では、いくつかの問題について説明しています: https://stackoverflow.com/a/1692421/139985

考慮すべきもう 1 つの点は、OOME が別のスレッドでスローされている可能性があることです。

  • compileSelectedFiles()メソッドまたは他のメソッドの 1 つが別のスレッドで作業を行っており、そこで OOME をスローしている可能性があります。

  • OOME は、Eclipse のバックグラウンド スレッドの 1 つでスローされている可能性があります。

いずれにせよ、それはcatch明らかにそれをキャッチしません。

System.gc()OOME の後に呼び出すのは時間の無駄であることに注意してください。とにかく解放されないメモリを解放しないことを保証できます。あなたがしているのは、JVMが役に立たないことに時間を浪費することを示唆しているだけです。運が良ければ、JVM は提案を無視します。


-Xmx私のアドバイスは、eclipse.ini ファイルの JVM パラメータを変更して、Eclipse のヒープ サイズを増やすことです。

于 2012-09-26T10:21:29.017 に答える
1

ほとんどの場合、OOM から回復するための信頼できる方法はありません。catch ブロックに入れようとするものは、利用できないより多くのメモリを必要とする可能性があるためです。また、GC は OOM がスローされる前にすでに最善を尽くしているため、再度質問しても意味がありません。

いつものように、Xmx オプションを使用してアプリケーションで使用できるメモリの量を増やすか、それほど多くのメモリを必要としないようにアプリケーションを修正できます。

もう 1 つの考えられるエラーの原因は、メモリ リークです。この場合、対処法は 1 つだけです。それを見つけて修正することです。配管工はそれを助けることができます。

于 2012-10-01T09:39:00.450 に答える
0

eclipse.ini(eclipse.exeと同じフォルダーにあります)に以下を追加してみましたか?

-Xmx1024m

これにより、Eclipseで使用可能なヒープスペースが増加します。問題がコンパイル中の場合、これで解決する可能性があります。ヒープスペースの制限として1GBのメモリを提供します。-Xmx512mただし、それほど多くのスペースを割り当てたくない場合は、試してください。

于 2012-09-26T10:07:12.260 に答える