UE和Lua的垃圾回收(GC)

一、算法

1、标记-清除算法(UE和Lua5.2之前)
算法步骤:

  1. 为所有的非root节点打上Unreachable标记
  2. 然后执行深度搜索,将搜索到的object的Unreachable标记去掉
  3. 最后将还有Unreachable标记的object对象去掉

2、三色-标记-清除算法(Lua5.2+)
该算法是对标记-清除算法的改进
标记颜色

  1. 白色:初始状态时,所有对象都为白色,表示这些对象均为未访问的
  2. 灰色:表示对象已被访问,但其引用对象还未被访问(待处理),灰色对象为黑色对象可直达的对象
  3. 黑色:表示对象已被访问且其引用对象也被访问,黑色对象被标记为活跃对象不会被GC

标记步骤

  1. 初始阶段:从根集合(全局变量、栈、寄存器等)开始,将根集合标记为黑色,根集合的对象均为可活跃对象,根集合引用到的对象均标记为灰色。
  2. 追踪阶段:垃圾回收器遍历灰色对象(灰色->黑色),将其标记为黑色,其引用对象标记为灰色(白色->灰色),重复追踪阶段,直到没有灰色对象
  3. 清除阶段:收集所有为被标记的对象(白色对象),释放它们占用的空间

注意:白色分为新白色和旧白色,旧的白色为需要释放内存的白色,而新的白色为新创建的对象,这部分不会马上被GC

3、簇Cluster(加快GC方法一)

  1. 将搜索到的节点加入到Cluster中,Cluster成员不会被打上Unreachable标记,
  2. Cluster引用到的成员也不会被GC搜索
  3. 若Object中有Unreachable的Cluster,则会便利Cluster中所有对象,并打上Unreachable
posted @ 2026-02-10 17:47  DarkShadow  阅读(2)  评论(0)    收藏  举报