私は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()
が実行されているときにヒープ上のインスタンスが増加しています。
を理解するのに役立つことがありインスタンスが収集されていないことを確認しますか?これらが大きく複雑なオブジェクトの場合、それらが何かによって参照されていないことを保証していますか?また、ガベージコレクタも実行していますか?きついループで実行している場合、GCは何らかの作業を行う機会を得られない可能性があります。 – RQDQ
完全なGC中に収集されるラージオブジェクトについて何かを覚えているようです。 – cHao
コメント行を試してください: 'dao.save(o);' – Azodious