标记对象图

标记阶段从已知入口开始,为发现的对象记录存活标记,再继续扫描其中的引用。已处理的对象不必无限重复展开,所以包含回路的对象图也能完成遍历。

根之外没有路径可达的一整组对象不会因为相互引用就自动获救。完成一次符合安全条件的标记后,未被标记的候选存储才交给清扫阶段处理。

参考:[1] [2]

把空闲空间重新交给分配器

清扫并不必总是一次完整的独立停顿。Boehm 回收器说明中,部分清扫工作可以延迟到分配发现相应空闲链表为空时,再按需进行。

Emacs 对不同对象采用不同存储安排:未使用的 cons 单元进入空闲链表,向量所在区域可以合并空闲块。清扫找到空间以后,分配器仍要决定哪些空洞适合后续请求。

参考:[1] [2]

保守识别与空间边界

保守回收器可能把某个看起来像对象地址的位模式也当成引用。这可以避免漏掉真实引用,却可能把已不用的对象多留一轮或更久;它不是按程序意图精确识别“无用”。

标记清除描述的是识别与回收方法,不保证所有对象都立即归还操作系统,也不保证没有碎片。实现可以额外采用分尺寸空闲链表、块合并或针对某类对象的压缩。

参考:[1] [2]