ThreadLocal

1.每条线程都有一个ThreadLocalMap对象,而可以有多个threadlocal对象存放在map中。

2.放在map中的key是WeakReference<ThreadLocal<?>>,也就是ThreadLocal的弱引用。

3.ThreadLocalmap会把那些过期的key设置为null,并且删除那些key为null的值。

4.ThreadLocalmap的key是弱引用,也就是说弱引用在没有被其他强引用所引用,gc就会回收。而value是强引用,如果用线程池技术,该线程一直没有结束,value一直没办法被回收。所以key为null的entry的value就一直占据内存,造成内存泄露。

5.因为上述的原因,在ThreadLocal这个类的get()、set()、remove()方法,均有实现回收 key 为 null 的 Entry 的 value所占的内存。所以,为了防止内存泄露(没法访问到的内存),在不会再用ThreadLocal的线程任务末尾,调用一次 上述三个方法的其中一个即可,一般使用remove。

相关推荐
二哈赛车手3 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
吃好睡好便好4 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
栗子~~4 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
YDS8294 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
仰泳之鹅4 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
未若君雅裁5 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
AI人工智能+电脑小能手6 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
阿维的博客日记6 小时前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring
雨辰AI6 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
x_yeyue7 小时前
三角形数
笔记·算法·数论·组合数学