【发布时间】:2011-06-30 13:39:19
【问题描述】:
简而言之 - tomcat 使用线程池,因此线程被重用。一些库使用ThreadLocal 变量,但不清理它们(使用.remove()),所以实际上它们将“脏”线程返回到池中。
Tomcat 具有在关闭时检测这些东西并清理线程本地变量的新功能。但这意味着线程在整个执行过程中都是“脏的”。
我能做的是实现一个Filter,在请求完成后(线程返回到池中),清理所有ThreadLocals,使用code from tomcat(那里的方法称为@ 987654326@).
问题是,值得吗?两个优点:
- 防止内存泄漏
- 防止库的不确定行为,假设线程是“新的”
一个缺点:
- 该解决方案使用反射,因此可能会很慢。当然,所有反射数据 (
Fields) 都会被缓存,但仍然如此。
另一种选择是将问题报告给不清理其线程本地变量的库。
【问题讨论】:
标签: java multithreading tomcat servlets