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

相关推荐
蛋蛋的就会顺顺的6 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
需要8267 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡7 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
死磕音视频8 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
伯恩bourne9 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
silvamux_9 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
省钱兄--zs10 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
顽疲10 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog10 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
用户212968352616810 小时前
开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐
java·llm