gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:45:39 24 4
gpt4 key购买 nike

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

Tomcat 具有在关闭时检测这些东西并清理线程局部变量的新功能。但这意味着线程在整个执行过程中都是“脏”的。

我能做的是实现一个Filter,并在请求完成后(线程返回到池中)立即清除所有ThreadLocal,使用code from tomcat (那里的方法称为 checkThreadLocalsForLeaks)。

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

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

一个缺点:

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

另一种选择是将问题报告给不清理其线程局部变量的库。

最佳答案

出于 2 个原因,我会通过向库开发人员报告问题的途径:

  • 它将帮助其他想要使用相同库但缺乏技能/时间来发现如此可怕的内存泄漏的人。
  • 帮助库的开发人员构建更好的产品。

老实说,我以前从未见过这种类型的错误,我认为这是一个异常(exception),而不是我们应该防范的事情,因为它经常发生。您能否分享您在哪个图书馆看到过这种行为?

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

关于java - 是否值得清理 Filter 中的 ThreadLocals 来解决与线程池相关的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5054265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com