深入剖析ThreadLocal为何会造成内存泄漏

首先要了解另一个概念:弱引用

弱引用 WeakReference:如果一个对象只剩下弱引用指向他,那么当进行GC时会被回收掉,且会把弱引用扔到一个与之建立时绑定的队列,GC后再用那个虚引用获取值就是null了

顺别说一下虚引用:与弱引用类似,唯一区别是即便gc还没回收它,在程序中也拿不到该对象,是个null;

进入正题

我们翻看threadLocal.set(valxxx)方法,发现他底层的大概逻辑是:根据当前代码执行所在线程,拿到线程中的threadLocalMap将一个key为当前threadLocal对象本身,value为valxxx的Entry放入其中【new Entry(threadLocal,valxxx)】;

然后我们发现这个Entry是这样声明的(下图):这说明这个key是以弱引用的方式放进来的,弱对应的threadLocal对象没有了强引用的指向,一旦被回收,这个key就是null了,map所在的线程不死,对应的value将无法被释放,从而造成内存泄漏

深入剖析ThreadLocal为何会造成内存泄漏_第1张图片

虽然实际情况中没有那种场景会造成这种内存溢出情况,但是也算一个值得注意的点, 所以如果对应threadLocalMap中的Entry无用了记得手动删除

你可能感兴趣的:(深入剖析ThreadLocal为何会造成内存泄漏)