Tomcat 7 で Web アプリを (テスト) 実行していて、"Find Leak" ボタンを使用しています。もちろん、停止/アンデプロイするとメモリ リークが発生します。
次の Web アプリケーションは停止 (リロード、アンデプロイ) されましたが、以前の実行のクラスがまだメモリにロードされているため、メモリ リークが発生しています (プロファイラーを使用して確認してください): /LeakyWebApp
だから私はJava VisualVMを使用しました(これを試すのは初めてです)
デプロイなしの Tomcat 起動時: http://img15.imageshack.us/img15/4441/tomcatstartup.jpg
私の Web アプリには以下が含まれます。
- クォーツ 1.8.5
- 休止状態 3.6.3
- JAXB 2.2.4
- セールスフォース API
- log4j
デプロイ直後: http://img850.imageshack.us/img850/2951/tomcatafterdeployment.jpg
それで、Quartzについて文句を言っていることに気付きました。また、サーブレットの破棄時にHibernate Session Factoryを閉じるためにどこかを読みました。
停止/アンデプロイ時に、Visual VM は Quartz スレッドが停止したことを示しますが、Tomcat ログには次のように表示されます
「...という名前のスレッドを開始したようですが、停止に失敗しました」
そこで、新しい ServletContextListener を作成し、contextDestroyed で Quartz ファクトリ スケジューラを呼び出してシャットダウンし、Hibernate Session Factory で close も呼び出します。別の展開/展開解除を行うと、上記のような Quartz スレッドの問題に関する tomcat ログからの苦情はなくなりました。
ただし、「リークを見つける」を使用しても、同じことについて不平を言います
次の Web アプリケーションは停止 (リロード、アンデプロイ) されましたが、以前の実行のクラスがまだメモリにロードされているため、メモリ リークが発生しています (プロファイラーを使用して確認してください): /LeakyWebApp
次に、JDBC ドライバーに関する別の不満を見つけた (戦争で mysql コネクタ jar を使用している) ので、それを削除しようとしました。Tomcat ログからの苦情は消えますが、「Find Leaks」は Web アプリにメモリ リークがあるという同じことを言います。
だから私の質問は - 他に何を見ればいいですか? および/または Visual VM をより適切に使用して、何が起こっているのかを検出するにはどうすればよいですか?
ありがとう
編集: David Feitosaの投稿に基づいてQuartzの問題を修正しました。行方不明でした
<init-param>
<param-name>wait-on-shutdown</param-name>
<param-value>true</param-value>
</init-param>
web.xml の Quartz プロパティから。
ただし、JDBC ドライバーにはまだ問題があります。Web アプリに必要であり、次の回答に基づいて 2 つの解決策があるようです:メモリ リークを防ぐため、JDBC ドライバーは強制的に登録解除されています。
- mysql-connector jar を tomcat/lib に配置します。
- contextDestroyed でドライバーを手動で登録解除します。
どの方法で行けばよいですか?また、そのためのベスト プラクティスは何ですか?