插入、删除、混合写屏障分别是什么?解决什么问题?
插入、删除、混合写屏障分别是什么?解决什么问题?
提示
题眼: 非常难、比较抽象,了解即可。
这里的屏障,指的是 GC 标记阶段用于维护对象可达性正确性的写屏障,不是日常并发编程里说的同步屏障。
它要解决的核心问题是:
- GC 在并发标记。
- 用户代码也在并发修改对象引用。
- 如果引用关系变了而 GC 不知道,就可能把仍然存活的对象误回收。
常见概念包括:
- 插入写屏障:在建立新引用时,记录这次写入,避免新挂上的对象漏标。
- 删除写屏障:在旧引用被删除时,记录原来的引用关系,避免对象因为“断开得太快”而漏标。
- 混合写屏障:综合前两者的思想,在并发标记场景下更稳妥地维护三色不变性。
重要
参考答案:
写屏障本质上是给 GC 用的一种保护机制。因为三色标记是并发执行的,用户代码在这个过程中随时可能修改对象之间的引用关系。如果没有写屏障,某个原本应该存活的对象就有可能因为引用变化没有被及时重新标记,最后被误回收。
插入写屏障关注的是“新引用加进来了怎么办”,删除写屏障关注的是“旧引用删掉了怎么办”。后来的混合写屏障就是把两类思路结合起来,尽量在不同引用变化场景下都保证标记正确。
所以你不用把它理解成业务层的同步工具,它更像是 GC 和用户代码并发运行时的一套保护规则。
相关信息
引申: Go 针对 STW 都做了哪些优化?什么是三色不变性?
