Tomcat 7にWebアプリケーションがあります。
Tomcatをシャットダウンすると、次の警告が表示されます(ただし常にではありません)
SEVERE: The web application [/MyApplication] created a ThreadLocal
with key of type
[org.Apache.xml.security.algorithms.MessageDigestAlgorithm$1] (value
[org.Apache.xml.security.algorithms.MessageDigestAlgorithm$1@2e2c2e2c])
and a value of type [Java.util.HashMap] (value
[{http://www.w3.org/2000/09/xmldsig#sha1=MESSAGE DIGEST SHA-1}]) but
failed to remove it when the web application was stopped. Threads are
going to be renewed over time to try and avoid a probable memory leak.
Apr 3, 2012 1:56:19 PM org.Apache.catalina.loader.WebappClassLoader
checkThreadLocalMapForLeaks SEVERE: The web application
[/MyApplication] created a ThreadLocal with key of type
[com.Sun.xml.bind.v2.ClassFactory$1] (value
[com.Sun.xml.bind.v2.ClassFactory$1@25442544]) and a value of type
[Java.util.WeakHashMap] (value [{class
com.classes.internal.ContactType=Java.lang.ref.WeakReference@17eb17eb,
class
javax.xml.bind.annotation.adapters.HexBinaryAdapter=Java.lang.ref.WeakReference@178a178a,
class
com.classes.internal.xjc.ListType=Java.lang.ref.WeakReference@181c181c,
class
com.classes.internal.xjc.MessageType=Java.lang.ref.WeakReference@17711771,
class
com.classes.internal.xjc.MessageType=Java.lang.ref.WeakReference@17011701}])
but failed to remove it when the web application was stopped. Threads
are going to be renewed over time to try and avoid a probable memory
leak. Apr 3, 2012 1:56:19 PM
org.Apache.catalina.loader.WebappClassLoader
checkThreadLocalMapForLeaks SEVERE: The web application
[/MyApplication] created a ThreadLocal with key of type
[org.Apache.xml.security.utils.UnsyncBufferedOutputStream$1] (value
[org.Apache.xml.security.utils.UnsyncBufferedOutputStream$1@4a904a90])
and a value of type [byte[]] (value [[B@67486748]) but failed to
remove it when the web application was stopped. Threads are going to
be renewed over time to try and avoid a probable memory leak.
シャットダウン時のcatalina.outでこれらの警告はどういう意味ですか?
いくつかのJAXBクラスが言及されているのを確認しましたが、ここで問題が何であるかわかりません。
何か助けてください?
アプリケーションに1つ以上のメモリリークがあります。これらが発生する理由、どのエラーが原因であるか、およびそれらを修正するために何ができるかについての完全な説明については、このプレゼンテーションを参照してください。 http://people.Apache.org/~markt/presentations/2010-11-04 -Memory-Leaks-60mins.pdf
一言で言えば、いくつかの ThreadLocals は適切にクリーンアップされていません。ほとんど(すべてではないにしても)のJ2EEサーバー/アプリケーションコンテナは、着信要求やその他のタスクにスレッドプールを使用して、常に新しいスレッドを開始するオーバーヘッドを防ぎます。問題は、一部のライブラリー(およびあなた自身が、よく分からない場合)は、タスク/要求の実行の終了後にそれらのThreadLocalsをクリーンアップしないことです。
通常、スレッドは実行の終了時に終了するため、ThreadLocalsに格納されているオブジェクトは参照されなくなり、ガベージコレクターがそのようなオブジェクトの削除を処理します。
各スレッドは、スレッドが有効でThreadLocalインスタンスにアクセスできる限り、スレッドローカル変数のコピーへの暗黙的な参照を保持します。スレッドがなくなると、スレッドローカルインスタンスのすべてのコピーはガベージコレクションの対象になります(これらのコピーへの他の参照が存在しない限り)。
ただし、スレッドがスレッドプールからフェッチされた場合、スレッドは停止せず、プールに返されます。スレッドはまだ生きているので、参照されているThreadLocalsも同じです。これは、同じThreadLocalが使用され、リクエスト/タスクを処理するスレッドが以前に使用された場合に、メモリリークとあるリクエストから別のリクエストへの値の「リーク」の両方として現れます。
少なくとも1つのJAXBメッセージが既知のバグに関連しているようです:
org.Apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks SEVERE:Webアプリケーション[/ MyApplication]は、タイプ[com.Sun.xml.bind.v2.ClassFactory $ 1]のキーを持つThreadLocalを作成しました(値[com.Sun.xml.bind .v2.ClassFactory $ 1 @ 25442544])およびタイプ[Java.util.WeakHashMap]の値
JAXB-56 および JAXB-831 を参照してください(注-これらはJava.netにあり、表示するにはログインが必要です)。最初のバグはおそらく修正されましたが、他の人がコメントしたように、これは完全には修正されていません。 2番目のバグには、問題を軽減するコンテキストシャットダウンを実行する前にgc()を強制するという回避策が提案されています(完全に排除するわけではありません)。カスタムServletContextListener
を使用してSystem.gc()
をcontextDestroyed()
メソッドで使用します。
他のエラーについては、他の回答のアドバイスに従い、深刻なデバッグを行う必要があります。