垃圾收集器
在Lua5.0之前, Lua语言使用的都是一个简单的标记-清楚(mark-and-sweep)式垃圾收集器(Garbage Collector GC)。这种收集器又被称作“stop-the-world(全局暂停)式的收集器,意味着Lua语言会时不时地停止主程序的运行来执行一次完整的垃圾收集周期(garbage-collection style)。 每一个垃圾收集周期由四个阶段组成:标记( mark), 清理(cleaning),清除(sweep)和析构(finalization)。
标记阶段把根节点结合(root set)标记为活跃,根节点集合由Lua语言可以直接访问的对象组成。在Lua语言中,这个集合只包括C注册表。
保存在一个活跃对象中的对象是程序可达的,因此也会被标记为活跃(弱引用不遵循这个规则)。当所有可达对象都被标记为活跃时,标记阶段完成。
Lua先执行清理阶段,再开始清除阶段。在清理阶段中处理析构器和引用表。首先,Lua语言遍历所有被标记为需要进行析构,但有没有被标记为活跃状态的对象,这些没有被标记为活跃状态的对象会被标记为活跃(复苏)