Java并发编程——ThreadLocal内存泄漏
看到有人说:Threadlocal的错误使用,会导致内存溢出,所以来分析一下源码。
(只展示关键部分)
1、ThreadLocal所存储的数据最终存在Entry对象,Entry对象虽然继承自弱引用,但是只和key值是弱引用关系,与value值是强引用关系。
所以,关系是:ThreadLocalMap拥有Entry的引用,Entry拥有value的引用。
2、ThreadLocal并没有ThreadLocalMap的引用,因此即使将ThreadLocal声明成Static也不会对ThreadLocalMap造成任何影响。
但是,观察ThreadLocal的set函数,会发现,Thread(当前线程)中有ThreadLocalMap的引用,
结果显而易见:只要当前线程不死,资源就无法释放,一旦线程卡死,那么就会导致当前线程的值无法回收。
3、实在没办法,调用一下remove函数即可,函数最终会将对象置空
结论:
简而言之,就是 ThreadLocal 中的 value 与 Thread.currentThread() 是强引用关系,在 Thread 无法正常销毁的场景下,就有内存泄漏的隐患(例如:线程池)。
疯狂的妞妞 :每一天,做什么都好,不要什么都不做!