4

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 ドライバーは強制的に登録解除されています。

  1. mysql-connector jar を tomcat/lib に配置します。
  2. contextDestroyed でドライバーを手動で登録解除します。

どの方法で行けばよいですか?また、そのためのベスト プラクティスは何ですか?

4

1 に答える 1

4

この種のWebアプリで見つかったメモリリークの問題のほとんどは、Quartzに関連しています。これを解決するには、適切なQuartzサーブレットを使用してファクトリを初期化してみてください:http://quartz-scheduler.org/api/2.0.0/org/quartz/ee/servlet/QuartzInitializerServlet.html

Quartzのドキュメントと同様に、次を使用してみてください。

 <servlet>
     <servlet-name>
         QuartzInitializer
     </servlet-name>
     <display-name>
         Quartz Initializer Servlet
     </display-name>
     <servlet-class>
         org.quartz.ee.servlet.QuartzInitializerServlet
     </servlet-class>
     <load-on-startup>
         1
     </load-on-startup>
     <init-param>
         <param-name>config-file</param-name>
         <param-value>/some/path/my_quartz.properties</param-value>
     </init-param>
     <init-param>
         <param-name>shutdown-on-unload</param-name>
         <param-value>true</param-value>
     </init-param>
     <init-param>
         <param-name>wait-on-shutdown</param-name>
         <param-value>true</param-value>
     </init-param>
     <init-param>
         <param-name>start-scheduler-on-load</param-name>
         <param-value>true</param-value>
     </init-param>
 </servlet>

これがお役に立てば幸いです。

于 2012-04-24T14:53:37.643 に答える