2012-02-16 15 views
3

私はJavaアプリケーションでメモリ使用に問題があります。私の人生の間、ガベージコレクタがそれをソートしない理由を理解できません。次のようにコードがある: - 私はJProfilerをして​​プロファイリングとヒープを見てきましたこれを識別するためにプライベートメソッドコールのガベージコレクション

public void foo() { 
    for(int i=0; i<50000; i++) { 
     bar(i); 
    } 
} 

private void bar(int i) { 
    LargeObject o = new LargeObject(); 
    ... 
    dao.save(o); 
} 

私の問題は、のLargeObjectのインスタンスがガベージコレクションになっていないということです。 LargeObjectインスタンスは、クラス変数によって参照されることは決してありません。実際には、bar()の外部には参照されません。私は感じているストローで握っていますが、これはトランザクションが開始/終了する場所に関連する可能性がありますか? bar()を公開し、Propogation.REQUIRES_NEWと注釈を付けて、foo()の注釈を無効に変更してみました。

DAO内のコードは次のようになります。私はそれがJProfilerをにおけるアクティビティの参照として

public void save(LargeObject o) { 
    hibernateTemplate.getSessionFactory().getCurrentSession().saveOrUpdate(o); 
} 

ガベージコレクションは間違いなく実行されます。 foo()は約30分、bar()は36ms、ガベージコレクションのスパイクはおよそ60秒ごとです。

私はなぜ彼らがガベージコレクションされていないのか知る質問に答えるために、システム内の何もLargeObjectを参照していませんが、foo()が実行されているときにヒープ上のインスタンスが増加しています。

+0

を理解するのに役立つことがありインスタンスが収集されていないことを確認しますか?これらが大きく複雑なオブジェクトの場合、それらが何かによって参照されていないことを保証していますか?また、ガベージコレクタも実行していますか?きついループで実行している場合、GCは何らかの作業を行う機会を得られない可能性があります。 – RQDQ

+0

完全なGC中に収集されるラージオブジェクトについて何かを覚えているようです。 – cHao

+0

コメント行を試してください: 'dao.save(o);' – Azodious

答えて

4

明らかにJPAプロバイダ(またはdao.save()の背後に隠れているもの)によって参照されているようです。あなたは参照を外部にさせるので、あなたのコントロールは失われます。あなたがプライベート/パブリックの方法でそれをするかどうかは関係ありません。

この「DAO」に関する詳細情報を共有したい場合があります。

+0

あなたの入力をありがとう - 私は休止状態がそれを保持しているかもしれないと考えていませんでした。 saveメソッドの背後にあるコードを示す最新の質問をご覧ください。あなたはこれを前に見つけましたか? – James

2

ループは、すべてのLarge Objectsインスタンスをキャッシュしなければならない一意のセッションに負担をかける可能性があるという@ MaDaの答えに追加します。あなたはどちらかを検討する必要があります。彼らはBatch Processingにセクションを読む

に関連していない場合は、保存、または新しいセッションを使用した後にセッションをフラッシュするか、各LargeObjectためのクリアセッションすることは、あなたがどのようにあなたの問題

関連する問題