ThreadLocal内存溢出(OOM)的原因

ThreadLocal是Java实现线程安全的一种方式,通过每个线程维护独立的副本避免并发问题。然而,不当使用可能导致内存溢出。尽管ThreadLocalMap使用弱引用减少内存泄漏风险,但若线程持续存在,value的强引用链仍可能导致内存无法回收,特别是在线程池中。为防止内存溢出,开发者应当在不再使用ThreadLocal时调用remove()或set(null)。
摘要由CSDN通过智能技术生成

ThreadLocal是Java提供的一个线程安全类,其原理是每个线程都拥有各自的变量内存副本。其实就是每个线程Thread里都有一个ThreadLocalMap类,用于存储变量值。更新、删除操作时,都是操作各自线程里的hreadLocalMap类,互不影响,从而达到的线程安全

ThreadLocal经常用于一次调用的上下文储存场景,例如一次调用的token、traceId,在调用的各个阶段都有可能用到,但是每次调用的值都不一样,这时ThreadLocal就派上用场了

但是如果ThreadLocal使用不当,会引发内存溢出,其实ThreadLocal的作者Josh Bloch在写ThreadLocal的时候,意识到了这点,例如弱引用等,但是依然会有内存溢出的可能,下面我们来分析一下原因

看源码ThreadLocal底层都是用的Thread里的ThreadLocalMap类,其实ThreadLocal就是一个工具类而已,底层都是操作的Thread里的ThreadLocalMap类。

 

再看看ThreadLocalMap的源码

 

当我们使用ThreadLocal.set()时,set的value与key(即业务自己定义的ThreadL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值