2017-10-28 3 views
0

を「GCオーバーヘッドの制限を超えて」多くの努力の後、私は避けエラー

GCオーバーヘッドの制限を得ることの問題を克服するために見えることはできませんが、私のJavaプログラムで

エラーを超えていました。

大規模な文字列操作、多数のオブジェクトのリスト、およびDBへのアクセスを含む大きなメソッドの内部で発生します。 Iは、以下を試してみました:

  1. それぞれのArrayListの使用後に、私が追加しました:リスト=新しいArrayListの<を>();リスト= null;
  2. などの文字列ではなく、 50個の追加(str + = "....")私は、各テキストに合計テキスト
  3. を追加しようとすると、各DBアクセス後にステートメントとresultSetsを閉じます。

このメソッドは、このようにメインから呼び出される:

このループは1回または2回実行されます
for(int i=0; i<L; i++) { 
    cns = new Console(i); 

    cns.processData();//this is the method 

    cns=null; 
} 

、すべてがOKです。 L> = 3の場合、ガベージコレクタエラーが発生することはほぼ確実です。

このメソッドを実行するたびに、cns = nullということはありませんか?強制的にGCを実行し、以前の実行からすべてを解放しますか?

オブジェクトのすべてのプライベート属性を削除してからnullにする必要がありますか?たぶんThread.sleep()を入れては、各ループの後にGCを強制する可能性がありますか?

+0

おそらく、3回目の実行ではあまりにも多くのメモリを占有しています。大きな方法を小さな方法に分割することをお勧めします。 GCを手動で呼び出すとThread.spleepは間違ったアプローチです。 – Admit

答えて

0

実際には、ループの最後にcnsをヌルに設定する理由はありません。とにかくループの始めにnew Console()に設定しています。何かがnullに設定されて解放された場合、新しいオブジェクトに設定することで解放されます。

System.gc();コールを試して、システムにガベージコレクションを実行させることもできますが、それが役立つか悪化させるかはわかりません。システムは既にガベージコレクションを試みています。そうでなければ、このエラーは発生しません。

あなたは文字列をどのように構築しているのか正確にはわかりませんが、+=は唯一の原因ではないことに注意してください。 String s = "Hello " + "to the" + " world";のようなものがあれば、3行に入れて+=を使うのと同じくらい悪いです。それが問題なら、StringBuilderはあなたの友人かもしれません。

このエラーを回避する方法については、Error java.lang.OutOfMemoryError: GC overhead limit exceededの回答をご覧ください。一部の人にとっては、あなたがほぼ間違っていても記憶から外れたときにそれが引き起こされるようです。したがって、Javaに利用可能なメモリの量を増やすことは、役立つかもしれません。

+0

あなたの答えをありがとう。 StringBuilderのヒントは私を助けました。また、DB側でも。ステートメントとResultSetを各ステートメントの後で閉じることは別として、Connectionをしばらく閉じておくのがよいでしょうか?それは記憶を保存するだろうか? – hragber

+0

メモリを節約できるかもしれませんが、重要な処理やデータベース呼び出しの間にユーザーの入力を待っていない限り、それほど価値はないかもしれません。接続を閉じたままにして新しい接続を作成すると、ガベージコレクションが増えるだけです。 –