我使用线程局部方法为每个应用程序线程提供一个 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但我可能在那里遗漏了一些东西。 我真的有泄漏吗?还是应该忽略此消息?
有人可以解释一下吗?
最佳答案
每次使用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/