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。

相关推荐
甄心爱学习5 分钟前
数据挖掘-聚类方法
人工智能·算法·机器学习
飞梦工作室15 分钟前
企业级 Spring Boot 邮件系统开发指南:从基础到高可用架构设计
java·spring boot·后端
haiyu柠檬18 分钟前
在Spring Boot中实现Azure的SSO+VUE3前端配置
java·spring boot·后端
星释30 分钟前
Rust 练习册 82:Hamming与字符串处理
开发语言·算法·rust
百***81271 小时前
【SpringBoot】SpringBoot中分页插件(PageHelper)的使用
java·spring boot·后端
百***86461 小时前
SpringBoot中自定义Starter
java·spring boot·后端
q***07141 小时前
VScode 开发 Springboot 程序
java·spring boot·后端
q***46521 小时前
Spring中使用Async进行异步功能开发实战-以大文件上传为例
java·后端·spring
q***38511 小时前
SpringCloud实战【九】 SpringCloud服务间调用
java·spring boot·spring cloud
岚天start1 小时前
K8S环境中Containerd运行时占用文件定位清理
java·rpc·kubernetes