インスタンスによって実装された Glassfish サーバーでいくつかのバックグラウンド タスクを実行してい@TimerService
ます。これらのサービスの目的は、ファイルからデータを抽出し、そのデータをデータベースに挿入することです。
最初は JPA でこれを実行しようとしましたが、システムが非常に簡単に停止したため、プロセスをはるかに応答性の高い JDBC に変換しました。ただし、途中のどこかでまだ特定できない巨大なメモリ リークが発生しています。
各ファイルは、独自のトランザクションを管理する方法で抽出されます (1 ファイル = 1 トランザクション)。このメソッドがすべての変数を確定すると、スコープが失われ、GC されると思いますが、そうではありません。非常に短い時間の後、私は を経験していOutOfMemoryException
ます。
Glassfish が私の変数 (非常に重いオブジェクト) への参照を保持するかどうか、どのように、なぜ保持するのか疑問に思っています。これらのメモリ リークを最小限に抑えるために、どのような設定や方法論を適用できますか?
参考までに、いくつかの変更を加えたストック Glassfish 設定を使用しています。
-XX:+CMSPermGenSweepingEnabled
-XX:+CMSClassUnloadingEnabled
-XX:MaxPermSize=256m
–XmX1024m