系列七、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;

相关推荐
专业的小学生13 天前
单线程缓存
缓存·线程·thread·threadlocal
袁慎建@ThoughtWorks14 天前
ThreadLocal那些事儿
java·jdk·多线程·threadlocal
zfj32119 天前
从源码层面解析一下ThreadLocal的工作原理
java·开发语言·threadlocal
J_liaty24 天前
ThreadLocal 深度解析:原理、实战与避坑指南
java·spring·threadlocal
萧曵 丶1 个月前
ThreadLocal 原理及内存泄漏详解
java·多线程·threadlocal
小毅&Nora1 个月前
【Java线程安全实战】③ ThreadLocal 源码深度拆解:如何做到线程隔离?
线程安全·threadlocal·jdk源码
阿拉斯攀登1 个月前
ThreadLocal 全解析(Spring Boot 实战篇)
java·spring boot·threadlocal
Maiko Star2 个月前
Gateway网关拦截自定义header & 用户上下文打通实战
gateway·threadlocal
蜂蜜黄油呀土豆2 个月前
ThreadLocal 深度解析:它解决了什么、原理是什么、如何正确使用(含代码与实战建议)
java·并发编程·内存泄漏·threadlocal
佛祖让我来巡山3 个月前
Java并发编程基础:从线程管理到高并发应用实践
thread·java多线程·threadlocal·java并发编程