ThreadLocal内存泄漏原因以及避免方案

本文深入探讨了Java中ThreadLocal的内存管理机制,解释了在特定条件下如何产生内存泄漏,并提出了有效的解决策略。通过源码分析,展示了Java如何优化处理废弃的ThreadLocal实例,避免内存资源浪费。

ThreadLocal的原理是操作Thread内部的一个ThreadLocalMap,这个Map的Entry继承了WeakReference,设值完成后map中是(WeakReference,value)这样的数据结构。Java中的弱引用在内存不足的时候会被回收掉,回收之后变成(null,value)的形式,key被收回掉了。 
如果这个线程执行完之后销毁,value也会被回收,这样也不会出现内存泄露。但如果是在线程池中,线程 执行完后不被回收,而是返回线程池中。此时Thread有个强引用 指向 ThreadLocalMapThreadLocalMap有强引用 指向 Entry,导致Entry中key为null的value无法被回收,一直存在内存中。在执行了ThreadLocal.set()方法之后一定要记得使用ThreadLocal.remove(),将不要的数据移除掉,避免内存泄漏。

通过分析源码,java也做了一定优化,即使出现了上述的(null,value)情况,再调用一次ThreadLocal.set()也可以将这个废弃的替代调用 


è¿éåå¾çæè¿°

这是java8种ThreadLocal.set()方法,for循环是遍历整个Entry数组,红色框的地方是碰到了(null,value)的处理逻辑。也就是碰到了内存泄漏后,会将原来的Entry替换掉,避免内存泄漏。 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值