从Lua看垃圾回收

从Lua看垃圾回收

引用计数

这个自然不需要多提(Lua本身没有使用这个)

对每个对象引用次数加一 失去-1 到0的时候自动回收

但是带来一个问题就剩 引用计数 所以在C++中 share_prt 才有了 weak_prt 这个指针配合 来消除循环应用

双色标记清除

每个状态都是二元的 白色表示未引用 黑色表示 引用

每次遍历对象列表 将所有可以遍历到的对象标记为黑色 遍历他所有的关联对象标记为黑色

最后白色的便是我们不需要的

这带来了一个问题: 每次回收过程不可打断 不然突然新加一个对象还没染色 GC结束了这里旧错误回收可能还要用的对象

每次GC不可打断还得暂停程序可不行

三色增量标记清除

  • 白色 待访问状态 初始状态

  • 灰色 带扫描状态 标识为GC已经访问过 但是其对象的其他引用对象还没访问

  • 黑色 自身对象 和 关联对象都访问过了

过程 :

  1. 初始化阶段 对象列表中 引用对象先从白到灰 改到灰色表中

  2. 标记阶段 从灰色列表取出一个对象 标记为黑色 遍历他的关联对象

    • 如果是关联对象是白色 标记灰色 加入灰色链表中

    • 灰色 肯定之后也会标记到 黑色表中 这里不管

  3. 遍历所有对象 如果白色就回收
    其他颜色等待下一次GC接着判断 重新回到对象列表中

对三色增量的改进 双白色

Lua 中白色交替使用 当前白色 和 非当前白色 每轮lua机制会交换认知这2个变量

在回收过程中更新 如果某个白色 不是当前使用的白色状态 虽然也是没有引用的对象 但是要到下轮变成当前使用白色才能回收

好处 虽然在Lua设计与实现中并没有讲 这里算我自己口胡吧 :

  • 减低误杀 这里解决了 不可打断问题 使得新加入的实例 非当前轮次不会删除的方案
  • 降低每次GC代价 因为部分真正回收的 要到下一轮回收 每轮代价降低

以上总结自 Lua设计与实现GC回收一章

你可能感兴趣的:(笔记,实习)