系列七、ThreadLocal为什么会导致内存泄漏

一、ThreadLocal为什么会导致内存泄露

1.1、ThreadLocalMap的基本结构

ThreadLocalMap是ThreadLocal的内部类,没有实现Map接口,用独立的方式实现了Map的功能,其内部的Entry也是独立实现的。源码如下:

1.2、ThreadLocal引用示意图

1.3、原因

ThreadLocalMap使用ThreadLocal的弱引用作为key,当ThreadLocal的变量引用被手动置位null的时候,即一个ThreadLocal没有外部强引用来引用它,当GC回收垃圾时,ThreadLocal一定会被回收掉,这样的话,ThreadLocalMap中就出现了key为null的Entry,这样的话线程就无法访问这个key为null的Entry中的value,如果当前线程再迟迟不结束的话(比如核心线程),这些key为null的Entry的value就会一直存在一条强引用链,即:Thread ref===>Thread obj===>ThreadLocalMap obj===>Entry===>value===>Object obj,当大量的这种强引用链存在时,就会导致内存溢出,即内存泄露最终会导致内存溢出。

1.4、解决

程序员在编码过程中 ,注意使用ThreadLocal时,要进行手动remove;

相关推荐
佛祖让我来巡山6 天前
【ThreadLocal全面解析】原理、使用与内存泄漏深度剖析
线程安全·内存泄漏·threadlocal
xdscode17 天前
SpringBoot ThreadLocal 全局动态变量设置
java·spring boot·threadlocal
在未来等你2 个月前
Java并发编程实战 Day 11:并发设计模式
java·设计模式·多线程·并发编程·threadlocal·生产者消费者·读写锁
理想奋斗中4 个月前
【并发编程 | 第五篇】探索ThreadLocal的原理
java·多线程·threadlocal·threadlocalmap
小沈同学呀5 个月前
SpringBoot中使用 ThreadLocal 进行多线程上下文管理及其注意事项
java·spring boot·后端·线程·thread·threadlocal
pingzhuyan8 个月前
EasyExcel: 结合springboot实现表格导出入(单/多sheet), 全字段校验,批次等操作(全)
java·spring boot·servlet·threadlocal·easyexcel
cyt涛9 个月前
SpringCloudGateway — 网关登录校验
运维·网关·gateway·登录·过滤器·校验·threadlocal
艾伦~耶格尔9 个月前
【Java后端】之 ThreadLocal 详解
java·后端·学习·线程·threadlocal
cyt涛9 个月前
公共字段自动填充-MyBatis-Plus
java·数据库·mybatis·mybatis-plus·threadlocal·自动填充·公共字段
岁岁岁平安10 个月前
springboot实战学习(10)(ThreadLoacl优化获取用户详细信息接口)(重写拦截器afterCompletion()方法)
java·spring boot·后端·学习·threadlocal·jwt令牌