该error的原因:
tomcat关闭应用时的清理工作(3): ThreadLocal
这个泄露其实是可能造成classloader的泄露,因为ThreadLocal
引用了自定义的类MyClass
,绑定到了当前的请求线程上,而请求线程又是线程池里的线程,生存周期可能会比较长。比如上面模拟的情况,要停止应用的时候,请求线程的ThreadLocal
仍未释放,那么即使加载MyClass
类的classLoader已经不会再被任何地方使用,可以被垃圾回收了,却因为这个MyClass
被引用而得不到回收。
解决方案:
private static ThreadLocal<MyClass> tl = new ThreadLocal<MyClass>();
try{
// doSomething()
} finally {
tl.remove();
}