該error的原因:
tomcat關閉應用時的清理工作(3): ThreadLocal
這個泄露其實是可能造成classloader的泄露,因爲ThreadLocal
引用了自定義的類MyClass
,綁定到了當前的請求線程上,而請求線程又是線程池裏的線程,生存週期可能會比較長。比如上面模擬的情況,要停止應用的時候,請求線程的ThreadLocal
仍未釋放,那麼即使加載MyClass
類的classLoader已經不會再被任何地方使用,可以被垃圾回收了,卻因爲這個MyClass
被引用而得不到回收。
解決方案:
private static ThreadLocal<MyClass> tl = new ThreadLocal<MyClass>();
try{
// doSomething()
} finally {
tl.remove();
}