七: GCA

文章目录

  • 7.1原理

  • GC算法
  • 解释器外难度最大
  • 参考云风的博客中
    • Lua垃圾回收算法分析的系列文章

7.1原理

  • 遍历所有对象,
    • 看哪些对象没被引用,
    • 没有引用关系的就认为是可回收的对象,可删除

  • 如何找出没有“引用”的对象

  • 用引用计数的GC算法,
    • 会在一个对象被引用的情况下将该对象的引用计数加一,反之减一
  • 如果引用计数为0,就没有引用的对象
  • 优点是不需扫描每个对象
  • 对象本身的引用计数只需减到0,就被回收
  • 缺点是有循环引用

难道是每次每个对象都很智能吗?一遇到我的引用为零,就把自己释放啊!

  • 标记清除算法( Mark and Sweep)
  • 每一次做GC时,先扫描且标记系统中所有对象,被扫描并且标记到的对象认为是可达的,这些对象不会被回收;
  • 没有被标记的对象认为是可以回收的。
  • Lua用的就是这种

  • 早期Lua5.0
  • (Two- Color Mark and Sweep,图7-1
  • 系统中每个对象非黑即白,
    • 要么被引用,要么没
七: GCA_第1张图片 七: GCA_第2张图片

请问这是否表示:还需要一个字段表示这个这个对象有没有被扫描过呢?

我操他妈,这个对象请问啥时候被标记成白色啊!!

  • 每个对象的状态“二元”,
  • 每个对象只可能有一种状态,
  • 这就要求这个算法每次做GC操作时不可被打断地一次性扫描并清除完所有对象。

  • 如果在遍历对象链表时标记每个对象颜色的过程中被打断
    • 此时新增一个对象,将这个对象标白还黑?
    • 为白,假如GC已经到回收阶段,
      • 那这个对象就会在没有遍历其关联对象的情况下被回收
    • 为黑,假如GC已经到回收,那这个对象在本轮GC中并没有被扫描过就认为是不必回收的
  • 双色标记清除算法中,标记阶段和回收阶段必须合在一起

黑色的,事实上他还没有被扫描过哦

  • 不能被打断,每次GC代价极大。
  • 在GC过程中,程序必须暂停下来,不能进行其他操作。

你可能感兴趣的:(lua系列)