深入探究Lua的GC算法(下)-《Lua设计与实现》
紧接着上一篇文章 zblade:深入探究Lua的GC算法(上)-《Lua设计与实现》 这篇文章让我们收尾GC的具体后续操作。转载请标明出处: http://www.cnblogs.com/zblade/ 3、GC的扫描阶段 GCSpropagate 只要处于这个阶段,就会分2种情况执行,一个是propagatemark,一个是atomic,让我们分别看其实现过程。 首先看处于灰色链表中一直都有对象的情况,在这步操作当中,是可以分步操作的,整个GC的分步操作,就是在这一步操作中,在每次扫描后,都会返回本次扫描标记的对象的大小之和,再下一个分步执行的时候再继续执行,而一旦进入atomic函数中,就需要一次性的执行,不能再分步执行了。 来看propagatemark函数是如何实现的: 对于table,如果该表是weak表,则退回到灰色状态,否则遍历表的数组和散列表部分进行标记,详见traversetable函数; 对于func,traverseclosure主要对func中的upval进行标记; 对于thread, 则将其移植到grayagain中,放在atomic中进行处理; 对于proto,对其中的字符串、upvalue、局部变量等进行遍历标记; 注意,这儿没有处理string\udata类型数据,这是放在其他部分进行的,不需要进行相关的标记; 4、GC 扫描阶段的barrier操作