ThreadLocal为什么会产生内存泄漏?

ThreadLocal 用来存储线程私有数据,数据存放在ThreadLocalMap中。ThreadLocalMap内部维护Entry[]数组。Entry继承WeakReference<ThreadLocal<?>>,Entry 以 ThreadLocal 为 key,保存对应的 value。key 是弱引用, 外部threadLocal=null之后,GC 可以回收 ThreadLocal 对象,避免了 key 对象的内存泄漏value 是强引用 。在线程池场景下,核心线程长期存活不会销毁,如果没有手动清理,value 存在强引用链就会发生内存泄漏。因此使用完成必须调用remove()防止内存泄漏。普通线程执行完毕后线程会被回收,ThreadLocalMap、Entry、value 随之回收,不会产生内存泄漏。

调用 set ()/get () 时底层会自动清理 key 为 null 的 Entry;但如果后续不再调用 get、set 方法,底层无法自动清理,依旧会发生 value 内存泄漏,所以最佳实践是手动调用 remove ()。

相关推荐
2601_962071573 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
zww89491113 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·eclipse
淡海水4 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
CS_Zero4 小时前
C语言sizeof是函数吗?
c语言·开发语言
-今昭-5 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
zww89491116 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
黑马程序员毕设7 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳7 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
白山编程大哥8 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
_Twink1e8 小时前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen