关于 ThreadLocal 清理原理


在 get操作遇到key为null时,则expungeStaleEntry进行探测清理,知道探测到null结束,返回探测的结束位置。我们先讲下探测式清理,也就是expungeStaleEntry方法,遍历散列数组,从开始位置向后探测清理过期数据,将过期数据的Entry设置为null,沿途中碰到未过期的数据则将此数据rehash后重新在table数组中定位,如果定位的位置已经有了数据,则会将未过期的数据放到最靠近此位置的Entry=null的桶中,使rehash后的Entry数据距离正确的桶的位置更近一些。expungeStaleEntry在清理元素后,会重新规划冲突的元素。
探测式清理是以当前Entry 往后清理,遇到值为null则结束清理,属于线性探测清理。

在set操作中以及replaceStaleEntry的方法中都会调用cleanSomeSlots,进行启发式清理
调用cleanSomeSlots()做一次启发式清理工作,清理散列数组中Entry的key过期的数据。而启发式清理被作者定义为:Heuristically scan some cells looking for stale entries.
在cleanSomeSlots内部会选择不同的位置为起点,轮训调用expungeStaleEntry进行向后探测清理

在set操作发现table[i]不为空时,并且发现了脏entry,调用 replaceStaleEntry 方法,内部会调用cleanSomeSlots清理脏entry。并且由于expungeStaleEntry会涉及rehash方法,效率较低,为了减少该次数,会进行先前和先后搜搜,确定线性探测的位置

一篇文章,从源码深入详解ThreadLocal内存泄漏问题:https://juejin.cn/post/6844903602436358157#heading-2
深入分析 ThreadLocal 内存泄漏问题:https://www.jianshu.com/p/1342a879f523
面试官:小伙子,听说你看过ThreadLocal源码?(万字图文深度解析ThreadLocal):https://segmentfault.com/a/1190000022663697


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM