ThreadLocal的内存泄露问题

有关ThreadLocal的解析已在这篇文章中说明????ThreadLocal源码解析

先上图????
ThreadLocal的内存泄露问题

先介绍一下内存结构:
每一个线程有每一个线程自己的ThreadLocalMap,线程之间互不干扰。
ThreadLocalMap中底层用数组table来存储,数组中的元素是Entry类型,Entry中包含key(弱引用),value(强引用)
讲清楚ThreadLocal内存泄漏之前要清楚弱引用和强引用的区别:简单来说,强引用在发生gc时,对象不会被垃圾回收;而弱引用指向的对象将被回收。
现在来分析内存泄漏的情况:
由图可知,ThreadLocal对象分别被ThreadLocal强引用和key弱引用,当强引用存在时,ThreadLocal在发生gc时不会被回收,而一旦当threadLocal=null时,即强引用消失了,发生gc时ThreadLocal则会被回收,那么对于这个key-value来说无法通过key值取获取到value,而value也无法被回收。无法使用但却一致占用着内存,如果value很大的话,对内存来说是极大的浪费。