深入剖析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将无法被释放,从而造成内存泄漏

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值