每一个 Thread 维护一个 ThreadLocalMap,key 会使用弱引用的 ThreadLocal 实例,value 为线程变量的副本,这些对象之间的引用关系如下:
由于 Thread 中包含了 ThreadLocalMap 的变量,因此 ThreadLocalMap 与 Thread 的生命周期是一样长,如果都没有手动删除对应 key,都会导致内存泄漏。
但是,由于 ThreadLocal 使用了弱引用,则多了一层保障;弱引用 ThreadLocal 不会内存泄漏,因为它会在下一次 GC 时被回收。
ThreadLocal 内存泄漏的根源是:Thread 被重复利用,导致 value 强引用链一直存在,而导致内存泄漏,注意,不是因为弱引用。