0

インスタンスによって実装された Glassfish サーバーでいくつかのバックグラウンド タスクを実行してい@TimerServiceます。これらのサービスの目的は、ファイルからデータを抽出し、そのデータをデータベースに挿入することです。

最初は JPA でこれを実行しようとしましたが、システムが非常に簡単に停止したため、プロセスをはるかに応答性の高い JDBC に変換しました。ただし、途中のどこかでまだ特定できない巨大なメモリ リークが発生しています。

各ファイルは、独自のトランザクションを管理する方法で抽出されます (1 ファイル = 1 トランザクション)。このメソッドがすべての変数を確定すると、スコープが失われ、GC されると思いますが、そうではありません。非常に短い時間の後、私は を経験していOutOfMemoryExceptionます。

Glassfish が私の変数 (非常に重いオブジェクト) への参照を保持するかどうか、どのように、なぜ保持するのか疑問に思っています。これらのメモリ リークを最小限に抑えるために、どのような設定や方法論を適用できますか?

参考までに、いくつかの変更を加えたストック Glassfish 設定を使用しています。

-XX:+CMSPermGenSweepingEnabled 
-XX:+CMSClassUnloadingEnabled 
-XX:MaxPermSize=256m
–XmX1024m
4

1 に答える 1

2

クラスローダーのリークに対処している可能性があります。JAXB は、アンマーシャリング時にこれを行うことができます。確実に調べるには、メモリアナライザーを使用する必要があります。Eclipse Memory Analyzer Toolを使用することを強くお勧めします。いくつかのチュートリアルに従うだけで、理解できるはずです。

于 2012-06-12T16:50:14.147 に答える