聊聊Go的三色标记法
我是一个着迷于产品和运营的技术人 , 乐于跨界的终身学习者 。欢迎关注我哟~每周五12点 按时送达~我的第「203」篇原创敬上
大家好 , 我是 Z 哥 。
今天带来一篇久违的技术型文章 。
之前也有不少小伙伴会问 , Z 哥你好久没发技术性文章了 。其实主要原因有以下几点 。
第一 , 目前的工作偏业务以及管理 , 的确在技术上的精力投入不如之前那么多 。这也限制了自己在纯技术性方面的知识输出 。
第二 , 虽然自己在工作之余 , 也会有一部分精力专门用于技术学习 , 但是大多是以新技术、新框架等的了解、熟悉为主 。涉及到的知识 Level 相对比较浅 , 就算发出来对大家的帮助也不大 , 就没发 。
第三 , 从长远来看 , 自己也不想太把自己局限在技术的圈子里 。因为在我看来 , 技术只是一门手艺 , 是吃饭的家伙 , 但是吃饭的家伙从来都不仅仅是技术 , 还有很多其它的方面 。甚至其中很多事情不像具体的技术细节那样「标准化」 , 有很多是通过血汗积累的「非标准化」经验 , 我认为这些经验的价值不亚于技术知识 。因此 , 作为有志与大家交朋友的 Z 哥 , 自然就不想把自己局限在「技术」这个小圈子里 。
好了 , 回到本文的正题 。最近正好在学习 Golang , 对它的里面用到的三色标记法的 GC 机制有些好奇(最开始是因为名字让我联想到了三色杯冷饮~) , 就稍微多深入了解了一下 , 在这里分享出来 , 或许将来对你面试啥的有些帮助 。
/01 判断对象存活的思路/
在 GC 领域里 , 判断对象存活的主流思路是两个 , 「引用计数」和「可达性分析」 。
01引用计数
顾名思义 , 引用计数的思路就是给每个对象进行计数 , 每被其它对象引用一次 , 计数就 +1 , 引用失效后 , 计数就 -1 。当计数器的数值为 0 , 就意味着它没有被使用 , 可以回收 。
02可达性分析
可达性分析的思路就是通过引用链路判断对象是否可被触达 , 如果能触达说明该对象当前正在被使用 , 不可回收;反之 , 没有触达到的对象则认为是无使用的 , 可以回收 。
这个引用链路的结构类似于有向有环图 , 但是根节点不止一个 , 是一个集合 , 称之为 GCRoots 。
目前主流的 GC 机制大多用的是「可达性分析」这条路线 。Go、Java、.Net等都是如此 。为什么引用计数不好用呢?因为它有一个特别严重的问题:无法处理循环引用 。
文章图片
文章图片
像上图这样的情况 , 引用计数永远不为 0 , 这些对象就永远不会被回收 , 这会严重影响回收的效果 。
但是它也并不是一无是处 , 它的回收实时性效果更好 , 可以配合「可达性分析」一起使用 , 发挥各自的优点 , 在不同的场景下使用不同的策略 。
由于 , 「可达性分析」思路是主流 , 所以后续发展出来的很多回收算法都以这个思路为基础的 , 三色标记法就是其中之一 。我们今天主要来聊聊它 。
/02 三色标记法/
在讲具体原理之前先了解一个概念 , 「Stop The World 」 , 简称「STW」 。
垃圾回收器的工作流程大体如下:标记出哪些对象是存活的 , 哪些是可回收的 。进行回收(清除/复制/整理) 。如果在回收期间有移动过的对象(复制/整理) , 还需要更新引用 。
第一步做标记的过程又可以分成两个步骤 。标记 GC ROOT 能关联到的对象 。这里会 STW 。从 GCRoots 的直接关联对象开始遍历整个对象图 。这里不会STW 。
垃圾回收算法主要做的就是第一步中的第二步 , 三色标记法也不例外 , 它将从GC Roots 开始遍历的对象标记为以下三种颜色:白色 , 初始值 。本次回收没被扫描过的对象默认都是白色的 。而确认不可达的对象也是白色 , 但是会被标记「不可达」 。灰色 , 中间状态 。本对象有被外部引用 , 但是本对象引用的其它对象尚未全部检测完 。黑色 , 本对象有被其它对象引用 , 且已检测完本对象引用的其它对象 。
- 智库论坛 | 社区电商推动供应链数字化转型的对策建议
- 人类与AI如何共处?诺奖科学家、将棋天才、“低欲望社会”提出者的不同解答
- 线上新书发布!云上带你了解有关“冬奥”的那些事儿
- 我的世界大闹天宫龙宫怎么玩(我的世界大闹天宫龙宫打法技巧一览)
- 复苏的魔女竞技场用什么队伍(复苏的魔女竞技场队伍搭配心得分享)
- 复苏的魔女魔导装备boss怎么打(复苏的魔女魔导妨害装备获取攻略大全)
- 今年的iphonese,还是你熟悉的模样
- 长安福特蒙迪欧在中国市场的“全球化”
- safari浏览器中的indexeddb漏洞
- 复苏的魔女时空裂隙用什么阵容好(复苏的魔女时空裂隙阵容搭配指南)
