WriterBuffer ThreadLocal未销毁

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()

评论区

JFinal

2018-11-01 11:06

这个是 tomcat 的误判,不用理会

tomcat 在 shutdown 或者 restart 的时候检测到 ThreadLocal 中有数据没有 remove(),报了一个消息而已。

这个误判会让 shutdown 稍微慢十秒到二十秒,不影响使用,误判输出的日志在 tomcat 自己的日志中,而且仅会在 shutdown 和 restart 中出去

ThreadLocal 的 remove() 是一种用法,不 remove() 是另一种用法,这是完全合理的用法

翻看一下 JDK 的 ThreadLocal 源码,不去 remove 是正确的用法,只要你保证在线程使用数据之前,清掉上次使用过的无用数据即可

JFinal

2018-11-01 11:09

未调用 remove() 方法移除对象,那么该对象会一直被 Thread 持有,该 Thread 下次接收到任务时可以再次获取到前面创建的对象,从而实现了类似对象缓冲池的效果

jfinal 官方这周会将 tomcat\jetty 换成 undertow,不会再出现这样的提示

lang3126

2018-11-01 13:58

谢谢回复。

杜福忠

2018-11-03 11:13

@JFinal 老大 换成 undertow后, 可以直接在线上装个JDK后, 就进行使用了对吧?

JFinal

2018-11-03 12:50

@杜福忠 没错的,今天周六,经过上午的开发,只剩热加载这一个功能就开发完了

undertow-server 比 jetty 启动速度要快得多了,而且轻量级到了极致

myth4ian

2019-10-12 18:04

经过测试这个问题在redeploy war包之后会造成内存溢出。@JFinal

hb963724769

2020-06-04 08:56

@myth4ian 这个问题有办法解决吗

myth4ian

2020-06-09 09:06

@hb963724769 没有什么太好的办法 这个似乎与tomcat的机制有关

JFinal

2020-06-09 11:21

@myth4ian 没有内存溢出, 注意看 tomcat 输出信息的措辞

myth4ian

2020-06-09 11:57

@JFinal 这个我有在linux环境下tomcat8.5上测试过 内存占用会随着实例的reload 或者deploy不断增加但是运行过程并没有什么问题,只是使用tomcat的manager管理war包部署的时候发生,解决办法就是内存占用多了的时候重启一下tomcat的服务就好了。

myth4ian

2020-06-09 11:57

@JFinal 使用undertow部署没有这个问题。

JFinal

2020-06-09 12:17

@myth4ian tomcat 在输出信息中的措辞是:probable memory leak.

也就是说,它也只是说可能的内存泄漏,其实是没有的,这个地方我做过很严格的测试,放心使用

热门反馈

扫码入社