java - tomcat线程本地内存泄漏

标签 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

最佳答案

每次使用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();
    }
}

关于java - tomcat线程本地内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10716332/

相关文章:

java - 从 webapp 执行外部 Java 程序

java - servlet 真的可以访问 Tomcat 的 lib 目录中的 jar 吗?

c++ - C++程序什么都不做,但是Valgrind显示内存分配

java - 动态调度和通用接口(interface)工厂

hibernate - 升级到 Postgres 9.2(包括 Hibernate)和 Tomcat 7

java - 为什么这个java程序不能运行?

c++ - 抛出异常c++后内存泄漏

android - MapView 中的 Fragment 内存泄漏

java - 实体管理器获取或创建

java - 无法在 IA 32 位平台上加载 AMD 64 位 .dll