2

スレッドローカルアプローチを使用して、アプリケーションスレッドごとにjsonシリアライザーを設定し、シリアル化するたびにオブジェクトが作成されないようにしています。

私が使用しているコードは次のコードです。

public class JsonSerializerFactory {
    private static final ThreadLocal<JsonSerializer> JSON_SERIALIZER = 
        new ThreadLocal<JsonSerializer>() {
        @Override 
        protected JsonSerializer initialValue() {
             return new JsonSerializer();
        }
    };

public static JsonSerializer get() {
    return JSON_SERIALIZER;
}

}

シリアライザーを取得するたびに、次のことを行います。

JsonSerializerFactory.get()

Tomcatをシャットダウンすると、次のログが表示されます。

May 23, 2012 9:15:25 AM org.apache.catalina.loader.WebappClassLoader     clearReferencesThreads SEVERE: The web application [] appears to have started a thread named [Logback AsyncAppender Dispatcher [Async_Logger] - Thread-16] but has failed to stop it. This is very likely to create a memory leak.

Tomcatのメモリリーク保護を読みましたが、おそらくそこに何かが欠けています。本当にリークがありますか、それともこのメッセージを無視する必要がありますか?

誰か説明してもらえますか?

Tomcatスレッドプールの動作を強化する方法をご覧ください

4

2 に答える 2

2

を使用するたびに、ThreadLocalそれをクリアするための何らかの方法が本当に必要です。tomcatが不満を言っているのは、logbackによって内部的に作成されたスレッドがこのスレッドをローカルで参照しているため、収集されないことです(スレッドが停止しないと仮定します)。

次の場合は、このメッセージを無視できます。

  • ホットアプリケーションのリロードはそれほど重要ではありません。アプリをリロードした場合のリークのみです。
  • アプリケーションが停止すると、ログバックスレッドが終了することがわかります。

ThreadLocal考えたいのは、そもそもキャッシュが必要かどうかです。それはJsonSerializer本当にそんなに高いですか?スレッドセーフではないと確信していますか。

public class JsonSerializerFactory {
    public static JsonSerializer get() {
        // do this until you know you have a problem.
        return new JsonSerializer();
    }
}
于 2012-05-23T09:11:27.367 に答える
0

それはあなたのコードとは何の関係もないと思います。

于 2012-05-23T08:43:36.553 に答える