UE和Lua的垃圾回收(GC)
一、算法
1、标记-清除算法(UE和Lua5.2之前)
算法步骤:
- 为所有的非root节点打上Unreachable标记
- 然后执行深度搜索,将搜索到的object的Unreachable标记去掉
- 最后将还有Unreachable标记的object对象去掉
2、三色-标记-清除算法(Lua5.2+)
该算法是对标记-清除算法的改进
标记颜色
- 白色:初始状态时,所有对象都为白色,表示这些对象均为未访问的
- 灰色:表示对象已被访问,但其引用对象还未被访问(待处理),灰色对象为黑色对象可直达的对象
- 黑色:表示对象已被访问且其引用对象也被访问,黑色对象被标记为活跃对象不会被GC
标记步骤
- 初始阶段:从根集合(全局变量、栈、寄存器等)开始,将根集合标记为黑色,根集合的对象均为可活跃对象,根集合引用到的对象均标记为灰色。
- 追踪阶段:垃圾回收器遍历灰色对象(灰色->黑色),将其标记为黑色,其引用对象标记为灰色(白色->灰色),重复追踪阶段,直到没有灰色对象
- 清除阶段:收集所有为被标记的对象(白色对象),释放它们占用的空间
注意:白色分为新白色和旧白色,旧的白色为需要释放内存的白色,而新的白色为新创建的对象,这部分不会马上被GC
3、簇Cluster(加快GC方法一)
- 将搜索到的节点加入到Cluster中,Cluster成员不会被打上Unreachable标记,
- Cluster引用到的成员也不会被GC搜索
- 若Object中有Unreachable的Cluster,则会便利Cluster中所有对象,并打上Unreachable
浙公网安备 33010602011771号