TheadLocal出现的内存泄漏具体泄漏的是什么?弱引用在里面有什么作用?什么情景什么问题?

首先ThreadLocal是什么就不介绍了!这篇是讲讲里面的东西。

再简单说一下强引用和弱引用,举个例子,我们平常new出来的对象就是强引用的,在栈中有强引用,所以在gc的时候,堆中的实例对象不会被清除掉。

弱引用,如果一个对象只有被弱引用,在发生gc的时候就会被清除掉,原先的弱引用就会指向null。

使用ThreadLoal都有哪些对象会出现泄漏?

1、ThreadLocal对象实例

2、ThreadLocalMap中的Entry对象

3、Entry对象中value的具体指向

具体:

1、ThreadLocal对象实例有两个引用(假如两个都是强引用),一个是栈中的引用,一个是Entry中的key引用。当业务代码执行完,用完ThreadLocal,栈中这个引用关系就清除掉,此时ThreadLocal实例还被key引用,key在Entry中,Entry在ThreadLocalMap中,Map的引用是当前线程,当前线程存在,那么这一系列Map-->Entry-->key,value-->ThreadLocal都不会被清除掉。

所以设计了key是个弱引用,当栈中的强引用关系清除后,key的弱引用随时被gc掉,不会影响ThreadLocal实例对象被清除。

2、在jdk自己解决了ThreadLocal实例内存泄漏的问题了,那么Entry呢?

在前面ThreadLoacl对象被gc了,那么这个key就变成了null。线程、Map一直存在,但是Entry用不到了,也一直被引用着,所以这个需要使用Remove方法,这个方法是将Entry从Map中移除,前提是这个key引用ThreadLocal还在,不然找不到这个Entry。如果都等到ThreadLocal对象被gc掉,那么Map中就会出现很多的key为null的Entry。

所以remove()方法是为了防止Entry对象泄漏的。

在理论是不允许出现key为null的Entry的,但实际上还是避免不了,所以ThreadLocalMap对此也做了优化,ThreadLocalMap在每次调用set()、get()、remove()方法时都会进行清理,以确保不存在key为null的Entry。

但是为了能够及时清理无用的Entry,一定要使用remove方法,不要占着内存,导致大量内存泄漏。

3、在Entry溢出的时候,value自然是溢出的,合理使用remove()方法,避免溢出!

在这里想问一下大家几个问题,一、什么时候会出现栈中ThreadLocal引用关系清除了,但是当前线程还在?

二、如果都不使用remove()方法,线程结束后,ThreadlocalMap会被清除掉吗?还会出现内存泄漏吗?

相关推荐
码兄科技7 小时前
Java AI智能体开发实战:从零构建智能对话系统指南
java·开发语言·人工智能
折哥的程序人生 · 物流技术专研8 小时前
第8篇:六大设计原则在工厂模式中的体现
java·设计模式·设计原则·工厂模式·编程进阶·扩充系列
小明bishe189 小时前
计算机毕业设计之基于JAVA的植物科普网站
java·spring boot·spring·架构·课程设计
r_oo_ki_e_9 小时前
Java Map 集合学习笔记
java·笔记·学习
SL-staff9 小时前
智慧园区2000+设备统一管理:JVS-IoT如何降低运维成本40%
java·开发语言·物联网·智慧园区·设备管理·运维优化·jvs-iot
咖啡八杯10 小时前
GoF设计模式——模板方法模式
java·后端·spring·设计模式
爱笑的源码基地10 小时前
一款全开源的信创云PACS影像云平台解决方案,支持多模态医学影像处理(CT/MR/DR/超声/病理等)
java·源码·国产化·pacs·云影像·区域pacs
我命由我1234511 小时前
Android 开发问题:ClickableSpan 的点击事件没有生效
java·java-ee·android studio·android jetpack·android-studio·android runtime
万亿少女的梦16811 小时前
基于Python的高考志愿填报辅助系统设计与实现
java·spring boot·python·mysql·vue