ThreadLocal内存泄漏的真实原因分析
下文笔者讲述ThreadLocal内存泄漏的原因分析,如下所示
ThreadLocal的简介
ThreadLocal功能:
提供线程内的局部变量
这种变量在线程的生命周期内起作用
减少同一个线程内多个函数或组件之间一些公共变量的传递的复杂度
注意谨慎使用ThreadLocal,滥用ThreadLocal会导致内存泄漏
ThreadLocal的原理图
每个Thread中
都维护一个ThreadLocalMap映射表
这个映射表中的key是ThreadLocal实例本身
value是需要存储的Object
ThreadLocal内存泄漏原理分析
由于ThreadLocalMap使用ThreadLocal中的弱引用作为key
当一个ThreadLocal没有外部强引用来引用它
则系统GC时,ThreadLocal会被回收
此时ThreadLocalMap中就会出现key为null的Entry
这是key为null,但是Entry的value不为空
如果当前线程未结束,则会出现
key为null的Entry的value强引用链
Thread Ref -> Thread -> ThreaLocalMap -> Entry -> value永远无法回收,造成内存泄漏
ThreadLocalMap中key使用弱引用的原理
key 使用强引用:
引用的ThreadLocal的对象被回收
但是ThreadLocalMap还持有ThreadLocal的强引用
如果没有手动删除,ThreadLocal不会被回收,导致Entry内存泄漏。
key 使用弱引用:
引用的ThreadLocal的对象被回收
由于ThreadLocalMap持有ThreadLocal的弱引用
即使没有手动删除
ThreadLocal也会被回收
value在下一次ThreadLocalMap调用set,get,remove的时候会被清除
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


