hibernate 3.6.4 と spring 3.2.4 (mvc、tx および security) を使用する Web アプリケーションがあり、Tomcat 7 で実行されています。Tomcat を再起動せずにアプリの新しいバージョンをデプロイするたびに、 tomcat は約 50MB 増加します。
いくつかのヒープ ダンプを作成し、Eclipse メモリ アナライザーで分析しました。アプリを再デプロイするたびに、WebappClassLoader の新しいインスタンスが作成されることがわかりました。しかし、Tomcat マネージャーでアプリケーションを停止した後でも、WebappClassLoader はメモリ内に残り、ガベージ コレクションは行われません。そのため、再デプロイするたびに追加の WebappClassLoader がメモリに残り、約 50MB のメモリを使用します。
WebappClassLoader から GC ルートへの参照パスを見つけるために、Eclipse メモリ アナライザーを使用しました。その結果、WebappClassLoaders がガベージ コレクションされるのを防ぐ可能性のある強力な参照を見つけることができませんでした。
では、何が WebappClassLoaders を存続させているのでしょうか? WebappClassLoader がガベージ コレクションから妨げられている原因を見つけるために、他にどこを調査できますか?
GC がガベージ コレクションを終了できないようにするブロッキング finalize() メソッドがあるのではないかと考えました。しかし、どうすればこれを確認できますか?