tomcat线程本地内存泄漏

时间:2012-05-23 08:37:21

标签: java tomcat memory-leaks thread-local

我正在使用线程局部方法为每个应用程序线程创建一个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 memory leak protection但我可能在那里遗漏了一些东西。 我真的有泄漏,还是应该忽略这条消息?

有人可以解释一下吗?

请参阅how to enhance tomcat thread pool behaviour

2 个答案:

答案 0 :(得分:2)

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

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

  • 热门应用程序重新加载并不重要,只有在重新加载应用程序时才会发生泄漏
  • 您知道当应用程序停止时,logback thread完成

您可能想要考虑的是,您是否首先需要ThreadLocal缓存。这JsonSerializer真的那么贵吗?你确定它不是线程安全的吗?

public class JsonSerializerFactory {
    public static JsonSerializer get() {
        // do this until you know you have a problem.
        return new JsonSerializer();
    }
}

答案 1 :(得分:0)

我说它与你的代码无关。