我正在使用线程局部方法为每个应用程序线程创建一个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但我可能在那里遗漏了一些东西。 我真的有泄漏,还是应该忽略这条消息?
有人可以解释一下吗?
答案 0 :(得分: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();
}
}
答案 1 :(得分:0)
我说它与你的代码无关。