threadLocal的内存泄漏及解决方法

定义:不再会被使用的对象或者变量占用的内存不能被回收,就是内存泄露。

Thread类维护了一个ThreadLocalMap。

ThreadLocal设置本地变量,实际上是在ThreadLocalMap创建了一个key-value。key是ThreadLocal,value是值,

ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
threadLocal.set(1);

ThreadLocal和ThreadLocalMap中的key是弱引用。

当没有强引用指向ThreadLocal时,ThreadLocal就会被回收,导致ThreadLocalMap中的key变为null,但是value和其指向的对象之间是强引用,由于value无法访问,导致对象不可回收。

长时间累积就会有内存泄漏的问题。

ThreadLocalMap中当key为null,在下一次ThreadLocalMap调用set(),get(),remove()方法的时候会被清除value值。

ThreadLocal正确的使用方法

  • 每次使用完ThreadLocal都调用它的remove()方法清除数据(推荐)
  • 将ThreadLocal变量定义成private static,这样就一直存在ThreadLocal的强引用,也就能保证任何时候都能通过ThreadLocal的弱引用访问到Entry的value值,进而清除掉 。

ThreadLocal的内存泄露?什么原因?如何避免? - 知乎

ThreadLocal为什么会导致内存泄漏? - Chen洋 - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值