Spring 3.1.2、Hibernate 4.1.8、および MySQL Connector 5.1.21 を使用する Tomcat 6.0.35 で実行されている Web アプリがあります。
数回再デプロイした後、Tomcat のメモリ不足 (Perm Gen) の原因を突き止めようとしています。
注: Tomcat の JVM メモリを増やすように言わないでください。
具体的には、VisualVM ツールを利用して、mysql や google スレッドの問題など、いくつかの問題を解消することができました。また、Web アプリで Velocity をシングルトンとして使用し、スレッド ローカル変数を正しい時間/場所で閉じないことによって引き起こされた問題を発見して修正することもできました。しかし、私はまだこの Hibernate の問題を完全に排除/把握することはできません。
これが私がやっていることです:
- 開発用 IDE から Web アプリケーションをデプロイする
- ブラウザで tomcat マネージャ ウィンドウを開く
- VisualVM を起動し、Tomcat インスタンスで HeapDump を取得します
- Tomcat マネージャーに移動し、webapp を再デプロイします
- VisualVM で別の HeapDump を取得する
私の最初の観察は、元の webapp の WebappClassLoader がガベージ コレクションされていないことです。
2 番目の HeapDump から保持されたオブジェクトを精査すると、クラス org.hibernate.internal.SessionFactoryImpl が目立つように機能するため、Spring またはそれらの線に沿った何かによって破棄/閉じられていないと信じられます (したがって、WebappClassLoader にはまだそれを参照してください)。
誰かがこの問題に遭遇し、それに対する正しい修正を特定しましたか?