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

相关推荐
小羊没烦恼!3 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里3 天前
java中的继承和多态的区别
java
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕3 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖3 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时3 天前
01-06-A-JVM排查实战详解
java·jvm
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
vipxieliang3 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++