org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [ROOT] created a ThreadLocal with key of type [com.jfinal.template.io.WriterBuffer$1] (value [com.jfinal.template.io.WriterBuffer$1@8e56ac]) and a value of type [com.jfinal.template.io.ByteWriter] (value [com.jfinal.template.io.ByteWriter@41a5f9]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
源码中没有找到 byteWriters.remove()
tomcat 在 shutdown 或者 restart 的时候检测到 ThreadLocal 中有数据没有 remove(),报了一个消息而已。
这个误判会让 shutdown 稍微慢十秒到二十秒,不影响使用,误判输出的日志在 tomcat 自己的日志中,而且仅会在 shutdown 和 restart 中出去
ThreadLocal 的 remove() 是一种用法,不 remove() 是另一种用法,这是完全合理的用法
翻看一下 JDK 的 ThreadLocal 源码,不去 remove 是正确的用法,只要你保证在线程使用数据之前,清掉上次使用过的无用数据即可