2011-01-21 15 views
3

JPAを使用してGlassfishで実行される単純なEARアプリケーションがあります。私のOracle DBテーブルからレコードを読み取り、処理します。処理されると、データベースにマークされ、エンティティマネージャでclear()を呼び出して、処理されたオブジェクトを切り離してGCで処理できるようにします。しかし、clear()ヒープの使用法を追加してから、ヒープ全体が減少し、最終的に最大ヒープにヒットします。リークの原因となる可能性のある他の物はありません。もっと何ができるのか分かりません。 JPAキャッシュもあります。Java Persistence(JPA)ヒープ問題

<property name="eclipselink.cache.shared.default" value="false"/> 

JPAオブジェクトが保持されていないことを確認するために何ができるのですか?トランザクションとは何か関係ありますか?処理するレコードの最後のバッチを更新するたびに、新しいトランザクションを使用します。

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 

何か提案があります。私はアプリケーションをプロファイルすることができますが、問題を見るのは非常に難しく、私がそれを収集していないJPAオブジェクトになると予想しても、エンティティを1回クリアするという点で私が何を欠いているのか分かりませんそれらはもはや必要ではない。

James

+1

よろしくお願いします。 – skaffman

答えて

2

JProfilerなどのメモリプロファイラを使用するのが最適です。

それ以外の場合は、メモリリークが発生する場所を絞り込んでください。原因を見つけるまで処理の各部分を削除してみてください。

時間の経過とともにメモリが不足していますか、最終的にはメモリ不足の大きなトランザクションを処理していますか?

処理しているオブジェクトに何も持たないようにしてください。おそらくあなたのコードのいくつかを含むでしょう。複雑なクエリはありますか?