4

のドキュメントはorg.apache.catalina.core.ThreadLocalLeakPreventionListener言う

スレッドローカル関連のメモリリークを回避するために、が停止しているLifecycleListenerときにエグゼキュータプール内のスレッドの更新をトリガーするA。Context

ThreadLocalメモリリークを正確に防ぐにはどうすればよいですか?コンテキストが停止したときに、ThreadLocalのメソッドを明示的に呼び出しますか?remove()

私の知る限りThreadLocal、ハッシュマップとして実装されています。マップキーは、ThreadLocalインスタンス自体への参照です。マップ値はスレッドローカル値です。

4

1 に答える 1

12

最初にいくつかの説明。ThreadLocalリークはThreadLocal、アプリケーション内にカスタムクラスを配置し、最初にクリアせずにそのアプリケーションをアンデプロイ/再デプロイすると発生しますThreadLocal。これが発生した場合でも、スレッドはクラスへの参照を保持し、クラスへの参照を保持します。このクラスはClassLoader、(既にデプロイされていない)Webアプリケーションによってロードされた他のすべてのクラスへの参照を保持します。

ThreadLocalまた、値は実際にはスレッドに格納されているため、スレッドはオブジェクトへの参照を保持します。クリアに失敗するThreadLocalと、この特定Threadの値が実行されている限り、オブジェクトによって保持されることを意味します。

ここで質問に戻ります。一部を削除するのを忘れた場合ThreadLocal、プールスレッドによって永久に参照されます。これは、Tomcatが防止しようとしていることです。リークが疑われる場合は、シャットダウンして新しいスレッドを作成します。Webアプリケーションには表示されませんが、プールスレッドを停止して新しいスレッドに置き換えると、古いスレッドがクラス、クラスローダー、その他すべてのものを参照する最後のオブジェクトになります。最後に、あなたのThreadLocal価値はGCの対象となります。

于 2013-02-14T19:58:02.627 に答える