每个线程(Thread
对象)内部维护一个 ThreadLocalMap
,用于存储该线程的所有 ThreadLocal
变量的键值对:
ThreadLocalMap虽然是ThreadLocal的静态内部类,但是
Thread
对象的属性,当线程存活时ThreadLocalMap
不会被回收。
-
Key:
ThreadLocal
实例的 弱引用(WeakReference)。 -
Value:实际存储的值(强引用)。
内存泄漏的必要条件:
-
线程复用(如线程池中的线程):
-
线程执行完任务后不会销毁,而是回到线程池等待下一个任务。
-
该线程的
ThreadLocalMap
会一直存在。
-
-
ThreadLocal 实例被回收:
-
如果
threadLocal
是静态变量,它不会被回收(生命周期与类一致)。 -
如果
threadLocal
是局部变量ÿ
-