ThreadLocal
内存泄漏的根源在于其特殊的实现机制与线程生命周期的交互。ThreadLocal
内存泄漏的根本原因在于其ThreadLocalMap
中值的强引用和线程的长生命周期。只有通过主动清理和合理管理线程,才能有效避免内存泄漏。下面来深入剖析:
1. ThreadLocal
的实现原理
- 内部结构:每一个
Thread
都有一个属于自己的ThreadLocalMap
,这个映射表的键是ThreadLocal
对象(采用弱引用),值则是用户设置的具体对象(强引用)。 - 弱引用的作用:当外部没有强引用指向
ThreadLocal
对象时,它会被垃圾回收(GC)。然而,此时ThreadLocalMap
里对应的Entry
的键就会变为null
。
2. 内存泄漏的触发情形
- 键为
null
的Entry
无法被访问:若ThreadLocal
被垃圾