公司网站建设费用记什么科目,网站建设解密,网页怎么弄,深圳网络推广建站lua垃圾回收(Garbage Collect)是lua中一个比较重要的部分。由于lua源码版本变迁#xff0c;目前大多数有关这个方面的文章都还是基于lua5.1版本#xff0c;有一定的滞后性。因此本文通过参考当前的5.3.4版本的Lua源码#xff0c;希望对Lua的GC算法有一个较为详尽的探讨。
L…lua垃圾回收(Garbage Collect)是lua中一个比较重要的部分。由于lua源码版本变迁目前大多数有关这个方面的文章都还是基于lua5.1版本有一定的滞后性。因此本文通过参考当前的5.3.4版本的Lua源码希望对Lua的GC算法有一个较为详尽的探讨。
Lua的垃圾回收器使用了三色标记算法这是一种基于标记-清除mark-and-sweep的改进算法。它引入了三种颜色来描述对象的状态以提高垃圾回收的效率和性能。
三色标记算法的三种颜色是 白色White初始状态下所有的对象都被假设为白色表示这些对象是未访问的、未标记的。 灰色Gray表示对象已被访问但其引用的其他对象尚未被标记。灰色对象可能有指向白色对象的引用即它们是待处理的对象。 黑色Black表示对象已被访问并且其引用的其他对象也已被标记。黑色对象及其引用的所有对象都是被标记为活跃对象不会被垃圾回收。
Lua的三色标记算法流程如下 初始标记阶段从根集合如全局变量、栈、寄存器等开始将根集合中的对象标记为黑色并将其引用的对象标记为灰色。这个阶段是一个快速的标记过程它只标记直接可达的对象。 追踪阶段在初始标记后垃圾回收器继续遍历灰色对象将它们标记为黑色同时将它们引用的白色对象变为灰色。这个过程会不断追踪、探索灰色对象的引用链直到所有可达的对象都被标记为黑色。 清除阶段清除阶段会回收所有未标记仍然是白色的对象释放它们占用的内存空间。这些未被标记的对象被认为是不可达的因此可以安全地回收其所占用的内存。 内存整理可选在清除阶段之后可能会对内存空间进行整理例如合并连续的内存块或重新组织内存布局以便在后续的内存分配中更有效地利用空闲块。
备注白色分为白1和白2。原因在GC标记阶段结束而清除阶段尚未开始时如果新建一个对象由于其未被发现引用关系原则上应该被标记为白色于是之后的清除阶段就会按照白色被清除的规则将新建的对象清除。这是不合理的。于是lua用两种白色进行标识如果发生上述情况lua依然会将新建对象标识为白色不过是“当前白”(比如白1)。而lua在清扫阶段只会清扫“旧白”(比如白2)在清扫结束之后则会更新“当前白”即将白2作为当前白。下一轮GC将会清扫作为“旧白”的白1标识对象。通过这样的一个技巧解决上述的问题。如下图(下图中为了方便颜色变换的理解没有考虑barrier的影响)
三色标记算法通过将对象分为三种状态减少了标记和追踪过程中对整个对象图的遍历次数提高了垃圾回收的效率。它的主要优势在于其增量式标记和回收策略使得垃圾回收过程可以分散到多个小步骤中降低了垃圾回收对系统造成的停顿时间。 参考
Lua GC机制分析与理解-上