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

每次你使用 a 时,ThreadLocal你真的应该有一些方法来清除它。tomcat 抱怨的是 logback 内部创建的线程在本地引用了这个线程,因此不会被收集(假设线程没有死)。

如果出现以下情况,您可能会忽略此消息:

  • 热应用程序重新加载并不那么重要,如果您重新加载应用程序,它只是一个泄漏
  • 你知道 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 回答