是否值得在Filter中清理ThreadLocals以解决与线程池相关的问题?
简而言之-
tomcat使用线程池,因此可以重用线程。一些库使用ThreadLocal
变量,但不清理它们(使用.remove()
),因此实际上它们将“脏”线程返回到池中。
Tomcat具有新功能,可以在关机时检测到这些情况并清理线程本地。但这意味着线程在整个执行过程中都是“脏”的。
我能做的就是实现一个Filter
,然后在请求完成之后(线程返回到池中)ThreadLocal
,使用tomcat中的代码清理所有s
(该方法称为checkThreadLocalsForLeaks
)。
问题是,这值得吗?两个优点:
- 防止内存泄漏
- 防止假定线程“新鲜”的库的行为不确定
一个缺点:
- 该解决方案使用反射,因此可能很慢。
Field
当然,所有反射数据都将被缓存,但是仍然会被缓存。
另一种选择是将问题报告给不清除线程本地变量的库。
回答:
我会通过以下两个途径向图书馆开发人员报告问题:
- 这将对希望使用同一库但缺少查找此类可怕内存泄漏的技能/时间的其他人有所帮助。
- 帮助图书馆的开发人员构建更好的产品。
老实说,我以前从未见过这种错误,我认为这是一个例外,而不是我们经常发生的情况应注意的错误。您能否分享您在哪个图书馆看到过这种行为?
附带说明一下,如果您仍然附加了ThreadLocal变量,则我不介意在开发/测试环境中启用该筛选器并记录严重错误。
以上是 是否值得在Filter中清理ThreadLocals以解决与线程池相关的问题? 的全部内容, 来源链接: utcz.com/qa/422746.html