4

Tomcatでスレッドローカルメモリリークエラーが発生し、ThreadPoolを使用していますが、WebアプリケーションにThreadLocalの実装がありません。

重大:Webアプリケーション[/ myWebApp]は、タイプ[org.a pache.http.impl.cookie.DateUtils $ DateFormatHolder $ 1](値[org.apache.http.imp l.cookie.DateUtils $ DateFormatHolder $ 1 @ 4c2849])およびタイプ[java.lang.re f.SoftReference](値[java.lang.ref.SoftReference@1e67280])の値ですが、Webアプリケーションが停止したときに削除できませんでした。スレッドは、メモリリークの可能性を回避するために、時間の経過とともに更新されます。

私が理解していないのは、実装していないのになぜスレッドローカルエラーが発生するのですか?これらのメッセージを取り除きたいので、Webを検索しました。ここでは、スレッドローカルをクリーンアップするために使用する必要があると書かれています。

ThreadLocal.remove()

しかし、私はThreadLocalの実装を持っていません。誰かが私に道を教えてくれれば幸いです。

4

4 に答える 4

2

問題はサードパーティのライブラリにあります。各リクエストの終了後に実際にクリーンアップしない限り、スレッドプール環境でスレッドローカルを使用することはできません。

この記事は問題を説明します:http: //blog.maxant.co.uk/pebble/2008/09/23/1222200780000.html

于 2012-05-02T14:14:22.837 に答える
2

明らかに、何かがその/それらのThreadLocalインスタンスを作成しています。それがあなたのコードでない場合、それはあなたが使用しているライブラリか、(ありそうもない)Tomcat自体でなければなりません。

まず、インスタンスを作成している可能性のあるものを確認します

    org.apache.http.impl.cookie.DateUtils$DateFormatHolder$1

(ちなみに、これはのネストされたクラスの匿名クラスDataUtilsです...したがって、何か奇妙なことが起こっていない限り、DateUtils.javaファイル内で作成が行われます。)

ソースコードを調べても問題が解決しない場合は、Tomcatインスタンスをデバッグし、ThreadLocalコンストラクターにブレークポイントを設定してみてください。

于 2012-05-02T14:21:31.950 に答える
2

ThreadLocalは、明らかに使用しているフレームワークまたはライブラリによって作成されています(HttpClientを使用しているものを確認してください)が、ログでわかるように、値はSoftReferenceであり、メモリリークを最小限に抑える必要があります。

実際、DateUtilsのコードで、スレッドローカルを作成していることがわかります...

于 2012-05-02T14:23:42.430 に答える
2

HttpClient JIRAは次のとおりです:https ://issues.apache.org/jira/browse/HTTPCLIENT-1216

リリース4.2.2から、clearThreadLocal()メソッドがあります。4.3以降、cookie-DateUtilsは非推奨になり、org.apache.http.client.utils.DateUtilsに置き換えられました。

シャットダウン時にDateUtils.clearThreadLocal()を呼び出すだけでは不十分であり、現在のスレッドのThreadLocalをクリアするだけなので、そのスレッドで日付を解析/フォーマットするHTTPリクエストを実行した後に呼び出す必要があります。ただし、これにより、ThreadLocalを使用することによるパフォーマンス上の利点のほとんどが失われます。

または、(Tomcatによって作成されていない)制御下のスレッドからHTTP要求を実行する場合は、アプリケーションのシャットダウン時にスレッドプール/エグゼキュータをシャットダウンすることを忘れないでください。

大きな残念なのは、HttpClientを簡単に変更してThreadLocalをオーバーライドしないようにすると、ThreadLocalがwebappとそのクラスローダーを参照せず、リークの大部分を回避できることです:(

于 2014-06-26T10:04:34.827 に答える