一尘不染

是否值得在Filter中清理ThreadLocals以解决与线程池相关的问题?

tomcat

简而言之-
tomcat使用线程池,因此可以重用线程。一些库使用ThreadLocal变量,但不清理它们(使用.remove()),因此实际上它们将“脏”线程返回到池中。

Tomcat具有新功能,可以在关机时检测到这些情况并清理线程本地。但这意味着线程在整个执行过程中都是“脏”的。

我能做的就是实现一个Filter,然后在请求完成之后(线程返回到池中)ThreadLocal,使用tomcat中代码清理所有s
(该方法称为checkThreadLocalsForLeaks)。

问题是,这值得吗?两个优点:

  • 防止内存泄漏
  • 防止假定线程“新鲜”的库的行为不确定

一个缺点:

  • 该解决方案使用反射,因此可能很慢。Field当然,所有反射数据都将被缓存,但是仍然会被缓存。

另一种选择是将问题报告给不清除线程本地变量的库。


阅读 622

收藏
2020-06-16

共1个答案

一尘不染

我会通过以下两个途径向图书馆开发人员报告问题:

  • 这将对希望使用同一库但缺少查找此类可怕内存泄漏的技能/时间的其他人有所帮助。
  • 帮助图书馆的开发人员构建更好的产品。

老实说,我以前从未见过这种错误,我认为这是一个例外,而不是我们经常发生的情况应注意的错误。您能否分享您在哪个图书馆看到过这种行为?

附带说明一下,如果您仍然附加了ThreadLocal变量,则我不介意在开发/测试环境中启用该筛选器并记录严重错误。

2020-06-16