ThreadLocal原理及内存泄露原因

原理:

1、相对于主存,每个线程都有自己的工作内存,物理上可以理解为cpu中的寄存器+高速缓存,每个线程都在工作内存维护一个ThreadLocalMap,ThreadLocalMap中的Entry的数据结构是(ThreadLocal,value)
2、get()方法是先从ThreadLocalMap中找到Entry,再从Entry中找到value


内存泄露原因:

Entry的数据结构是(ThreadLocal,value),其中的ThreadLocal位置是一个指向ThreadLocal对象的弱引用,弱引用在每一次full gc后都会被清理。然并卵,即使弱引用被清理了,Entry依然存在,即(null,value)


解决办法:
用完了ThreadLocal,手动调用remove()方法,看源码就知道,remove()方法可以将Entry对象置null

参考:
https://www.cnblogs.com/fengbs/p/7019687.html
https://www.cnblogs.com/dolphin0520/p/3784171.html
https://www.cnblogs.com/qiuyong/p/7091689.html
https://blog.csdn.net/wy1404081737/article/details/81489080

你可能感兴趣的:(Java)