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

相关推荐
程序猿进阶10 天前
ThreadLocal 释放的方式有哪些
java·开发语言·性能优化·架构·线程池·并发编程·threadlocal
栗筝i1 个月前
Java 并发编程:线程变量 ThreadLocal
threadlocal·栗筝i 的 java 技术栈·java 基础·java 并发·线程变量
少不入川。2 个月前
ThreadLocal源码分析
java·juc·threadlocal
_whitepure2 个月前
ThreadLocal详解
java多线程·threadlocal·threadlocal原理
Rcain_R4 个月前
JUC下的ThreadLocalRandom详解
java·后端·高并发·线程·juc·random·threadlocal
williamdsy4 个月前
【退役之重学Java】ThreadLocal
java·开发语言·threadlocal
大星星不见了5 个月前
Java-多线程-并发知识点03(面试/学习)
java·学习·面试·多线程·并发·threadlocal·aqs
大刀爱敲代码6 个月前
ThreadLocal的基本使用
java·线程·threadlocal
丁总学Java6 个月前
JDBC(数据库连接池,封装JDBCUtil,Apache的DBUtils,DTO,JDBC工具类事务问题,ThreadLocal)
数据库连接池·threadlocal·dto·封装jdbcutil·jdbc工具类事务问题