三分钟理解ThreadLocal的弱引用与内存泄露

 


 

存在场景ThreadLocal使用结束后,将ThreadLocal置为null,伪代码如下:

 ThreadLocal<String> a = new ThreadLocal<>();
 a.set("测试value");
 a=null;

1.为什么ThreadLocalMap的Entry中的ThreadLocal是弱引用?

如果Entry中的key为强引用

1.对象a断开了与堆中ThreadLocal对象的强引用;

2.Entry中的key持有ThreadLocal对象的强引用。

如果一个对象具有强引用,那垃圾回收器绝不会回收它 

即便将a置为null,a指向的ThreadLocal对象也不会被回收

如果Entry中的key为弱引用

1.对象a断开了与堆中ThreadLocal对象的强引用;

2.Entry中的key持有ThreadLocal对象的弱引用。

当垃圾回收器发现的对象仅有弱引用时,不管当前内存空间足够与否,都会回收它的内存

将a置为null后,a指向的ThreadLocal对象可顺利回收

2.ThreadLocal为什么会发生内存泄露?

由1得出,当a置为null后,因为弱引用的关系,Entry的key(ThreadLocal)可顺利回收

Entry的key被回收后,就会导致value成为一个不可达的强引用对象,此时value就会随Entry的回收而回收。

若线程由线程池调用且一直不被销毁,ThreadLocalMap不回收,因此产生了内存泄露。

 

因此在ThreadLocal使用结束后,必须要使用.remove()方法,将其value置为null,避免产生内存泄露。

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值