2016-08-23 5 views
0

はちょうど私達はたくさんのを持っているのEclipseLink 2.5.xのメモリリーク、ChangeTracking JPA、Glassfishの3.1は、EclipseLinkは2.5

MAT Memory Analysis とGlassfishの3.1.2上で動作するJava EEアプリケーションに大きなメモリリークを見つけるのに苦労してデータベース内のユーザよりもメモリ内のユーザエンティティのインスタンスが多くなります。 そして、永続性機能の変更の追跡は、各ユーザーごとに8 MBで狂っています。 最後に2 MB以上のものを2 GB以上消費します。

誰かがこのようなことが起こる可能性がありますか?

小さなアプリケーションで再現しようとしましたが、同様の現象はありませんでした。

+0

このプロファイルは、すべてを保持するUserCacheクラス(その内容とその理由)を示しています。あなたはどのようにユーザーオブジェクトをキャッシュしていますか? – Chris

+0

遅れて申し訳ありません。私の顧客は、Google guaveキャッシュを使用していくつかの情報へのアクセスを高速化しようとしています。 1つの間違いは、@Entitiesをキャッシュに入れることです。どうやら、entitymanagerとguaveキャッシュは、それらのオブジェクトを永遠に記憶しています。しかし、それは2.5 GBであってはなりません。合計で14000ユーザーしかありません。なぜ私は変更の追跡が非常に巨大なのか分かりません。データは変更されません。 –

+0

私はあなたのチェンジトラッキングのインスタンス自体がそれほど多くのメモリを保持しているとは思いません。あなたは、変更トラッカーが保持しているものを正確に突き止めていませんでした。それはコンテキストへのリンクを持っているかもしれません、そして、メモリの大部分を保持するコンテキストかもしれません。コンテキストは、それを介して読み込まれたすべてのエンティティを保持するため、すぐに追加できます。 – Chris

答えて

0

に追跡繰延変更を使用する方法についてはthisを参照してください。

私はJPAコンポーネントからガベージキャッシュを払いました。私は、エンティティの代わりにキャッシュ内にPojoを使用しました。だから私は100%確かに、キャッシュされたデータを参照しているものはない。

0

アプリケーションが静的にキャッシュする読み取り専用型のインスタンスの場合は、すべての変更がリリースされるまで構築されているため、変更の追跡は悪い考えです。

は、私はこの動作を防ぐためにどのような方法を発見した破片にDAOサービスの一部を分割した後、単一のエンティティ

関連する問題