日拱一卒

[01/15] Lua GC 的主要机制是什么?

Lua 5.0 以前,GC 流程无法中断,会导致虚拟机被彻底暂停,直到完成一次 full GC 再继续;Lua 5.1 及之后,实现了步进式的 GC,其主要思想为三色标记+标记清除。

一个对象刚被创建时,默认为白色。新一轮 GC 开始时,将以主线程、注册表等对象作为起点,将其加入到灰色对象组成的链表中。随后在每个 GC step 里,取出灰色链表中的一个对象,将其自己标记为黑色,并将其所有引用的白色对象标记为灰色并链入链表。GC step 的触发点分散在 Lua 的各个角落,多为涉及分配/释放内存的地方。直到灰色链表为空,即「所有」对象被遍历完成,此时将所有白色对象将被清除释放,GC 的一轮流程至此宣告结束。

由于整个 GC 的流程是分步的,其遍历过程中,对象的引用关系很可能发生改变。为此,Lua 的 GC 系统设置了两个 barrier 函数,一个用于将黑色对象修改为灰色对象,一个用于将白色对象修改为灰色对象。每当分散在 Lua 各个部分的内存写操作发生时,就会有对应的 barrier 调用过程,以「通知」GC 流程正确响应引用关系的变更。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据