0

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 の問題を完全に排除/把握することはできません。

これが私がやっていることです:

  1. 開発用 IDE から Web アプリケーションをデプロイする
  2. ブラウザで tomcat マネージャ ウィンドウを開く
  3. VisualVM を起動し、Tomcat インスタンスで HeapDump を取得します
  4. Tomcat マネージャーに移動し、webapp を再デプロイします
  5. VisualVM で別の HeapDump を取得する

私の最初の観察は、元の webapp の WebappClassLoader がガベージ コレクションされていないことです。

2 番目の HeapDump から保持されたオブジェクトを精査すると、クラス org.hibernate.internal.SessionFactoryImpl が目立つように機能するため、Spring またはそれらの線に沿った何かによって破棄/閉じられていないと信じられます (したがって、WebappClassLoader にはまだそれを参照してください)。

誰かがこの問題に遭遇し、それに対する正しい修正を特定しましたか?

4

1 に答える 1

1

私は現在、あなたのセットアップで何が間違っているのかわかりませんが、私が知っていることは、Plumbrを使用すると実際のリークを見つける可能性が高いということです。

于 2012-12-24T12:15:55.097 に答える