ThreadLocal图解
2021-03-26 14:47:58 13 举报
ThreadLocal图解
作者其他创作
大纲/内容
应用场景:1. Spring多数据源的切换2. Spring事务注解的实现3. 日志框架Slf4j中MDC类的实现
堆内存
10MB
ThreadLocal
ThreadLocal对象
引用堆内存中的某个对象
remove()
key(WeakRefrence)
value
ThreadLocalMap
栈内存
如何避免:1. 每次使用完ThreadLocal都调用remove()方法清除数据2. 将ThreadLocal变量尽可能地定义成static finalThreadLocal内部的优化1. 调用set()方法时,会采样清理、全量清理,扩容时还会继续检查2. 调用get()方法时,没有直接命中、向后环形查找时会进行清理3. 调用remove()时,除了清理当前Entry,还会向后继续清理
解释:1. ThreadLocal 栈内存中引用堆内存中的某一块地址2. ThreadLocalMap 同样栈内存中引用堆内存中的某一块地址3. ThreadLocalMap里Entry的key同样指向ThreadLocal对象的地址4. 假设这个时候栈内存中ThreadLocal被置为null,但是Entry的key还是指向ThreadLocal导致内存无法被释放,已经将key转换为弱引用解决此内存泄漏问题5. 但是value值还是强引用无法被释放,所以使用完需要remove掉
Thread
0 条评论
下一页