threadlocal 内存泄露原理
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
threadlocal 内存泄露原理
原理:ThreadLocal是线程本地变量,每个线程存在副本,有一个ThreadLocal 变量,有线程1,线程2,线程3,threadlocal对三个线程进行判断,set线程1,2,3,threadlocal的引用和value,它的实现原理是每一个线程都有一个threadlocalmap,这个map里面都一个key和value,key就是thread,value 就是刚开始调用threadlocal里面set进去的值,达到了线程副本的作用,线程隔离,每个线程之间互不干扰。
threadlocal的内存泄露:比如在栈内存中有一个变量threadlocal和threadlocalmap,栈内存中的threadlocal就会去引用堆内存中的threadlocal 对象,那么栈内存中threadlocal跟堆内存中threadlocal就是强引用(只要强引用存在,垃圾回收器就不会回收被引用的对象)的关系,对与单个线程threadlocalmap来说同样也会引用堆内存的某一块具体的地址,根据map的特点,map的key也会引用threadlocal,假如栈内存中threadlocal变量被置为null,但是map依然存在引用,导致了内存的泄露,虽然threadlocal本身已经做了一个优化,把key的强引用转化成了弱引用,但是同时value也存在强引用的关系,value并不会被释放,因此依然存在内存的泄露的问题,所以推荐调用threadlocalmap的remove方法去移除变量,释放内存。