有关ThreadLocal的内存泄漏简单理解
ThreadLocal
ThreadLocal没什么神秘的,他就是每个线程私有的一个变量而已。
每个线程都包含一个ThreadLocalMap类型的成员变量,该Map的每个Entry中,key-value的关系就是ThreadLocal-value的关系
ThreadLocal提供了get和set方法
当使用Set方法的时候,ThreadLocal会获取当前线程的对象,然后获取当前线程的ThreadLocalMap对象,然后再去以当前的ThreadLocal作为key去set一个值
当使用get方法的时候,ThreadLocal会获取当前的线程对象,然后获取当前线程的ThreadLocalMap对象,最后再用当前的ThreadLocal作为key去获取一个值
弱引用
Entry中的key是持有的对ThreadLocal的弱引用,也就是每一次GC的时候ThreadLocal在不存在强引用的关系下就会被回收♻️,但是Entry中的value却不会被回收♻️
所以每次使用完ThreadLocal的时候,需要再调用一下get/set/remove方法,都可以自动清除这个遗留的value
为何不是强引用
如果使用强引用的话,这个ThreadLocal对象永远不会被回收的,因为Entry中key是持有的ThreadLocal的强引用,只有在remove之后ThreadLocal才有可能被回收,否则的话容易造成OOM
本文作者:mirage_mc
本文链接:https://www.cnblogs.com/mirage-mc/p/15992040.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步