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 ()。

相关推荐
道尔柯南42 分钟前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++
来让爷抱一个2 小时前
Python 异步里混用同步库,事件循环被卡住的全过程
开发语言·python
kingx32 小时前
Bugku 3122 谷歌小恐龙题解:纯离线逆向 Vault 的 AES-GCM 加密资源(附 Python 解密器)
java·逆向·ctf·bugku·aes-gcm
DevOpenClub4 小时前
职教高考控制线 API:招生类别枚举、筛选与空分数含义
java·数据库·高考
心祭丫丫4 小时前
【每天一个 Python 小案例17】Python 实现通讯录
开发语言·人工智能·笔记·python·学习
露天赏雪5 小时前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel
天天被压力5 小时前
【A股分钟级高频数据完全手册 #06】北交所分钟级数据接口:京市股票Pro版最新分时
java·人工智能·python
天天被压力5 小时前
【A股分钟级高频数据完全手册 #05】指数历史分钟数据接口:Pro版沪深指数分时回放
java·人工智能·python
captain3765 小时前
▲统一功能——DispatcherServlet源码分析
java·spring·java-ee·log4j·maven
金銀銅鐵6 小时前
JDK 21 中 List.of 的实现细节:从 List12 到 ListN
java·后端·ai编程