随手记录00003-解决ThreadLocal内存泄漏

内存溢出:内存剩余大小无法支持接下来的适用、发生报错。
内存泄漏:一个对象被强引用且对象无用了、导致GC无法回收该内存。浪费内存空间。内存泄漏较多即内存浪费过多长时间会导致内存溢出。
ThreadLocal:容器的一种、可以存储对象、线程私有容器、自己存储自己拿
ThreadLocal应用场景:@Transactional开启事物、数据库连接存储到自己的线程ThreadLocal内、保证整个Transactional修饰的方法获取的是同一个connection(链接)
ThreadLocal实现原理:每一个Thread产生时都会伴随产生一个线程自己的ThreadLocalMap、存储对象即存储在自己的ThreadLocalMap内。map的key为 ThreadLocal,map的val为存储的对象。new一个Entry、Entry继承了弱引用WeakReference对象、调取WeakReference的构造方法产生一个弱引用指向ThreadLocal、所以ThreadLocal产生并且进行set后会有两个引用指向(强和弱)。
为什么Entry要使用弱引用?
若是强引用,即使tl=null,但key 的引用依然指向ThreadLocal对象,所以会有内存泄漏,而使用弱引用则不会。
ThreadLocal内存泄漏出现场景:ThreadLocal被回收,key 的值变成null,则导致整个value再也无法被访问到、且value为强引用,因此依然存在内仔泄漏。
解决办法:ThreadLocal确定不在使用时执行.remove方法.
tips:线程池读取线程回写的时候一定要ThreadLocal清空remove掉(避免内存泄漏到吃oom、下次获取线程读取到上次存储的数据造成数据污染)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值