Lua的GC机制

GC分析:

lua中GC采用的是标记-清除法,即一次GC分为2步

1:从根结点遍历GC对象,如果可达则标记

2:遍历所有的GC对象,清除所有未被标记的对象

二色标记法

Lua的GC机制

lua5.1之前采用的GC算法,缺点是GC的时候不能被打断,所以会严重卡住主线程

三色标记法:

Lua的GC机制

lua5.1后采用三色标记法

白色:在gc开始阶段,所有的对象都为白色,当遍历了一次后,任为白色,则删除白色

灰色:灰色应用在分布遍历阶段,如果有对象为灰色,则遍历就不会停止

黑色:被引用的对象,设为黑色,不会被删除,当GC完后被重置为白色

 

GC api:

(自动调用GC:当lua使用的内存到达阀值)

(该api为手动调用GC)

collectgarbage([opt [, arg]])

opt参数可以为:

  • “collect”:执行一个完整的垃圾回收周期,这是一个默认的选项
  • “stop”:停止垃圾收集器(如果它在运行),实现方式其实就是将gc.threshold设置为一个巨大的值,不再触发gc step操作
  • “restart”:将重新启动垃圾收集器(如果它已经停止)。
  • “count”:返回当前使用的的程序内存量(单位是Kbytes),返回gc->total/1024
  • “step”:执行垃圾回收的步骤,这个步骤的大小由参数arg(较大的数值意味着较多的步骤),如果这一步完成了一个回收周期则函数返回true。
  • “setpause”:设置回收器的暂停参数,并返回原来的暂停数值。该值是一个百分比,影响gc.threshold的大小,即影响触发下一次gc的时间,设置代码如下:

    g->gc.threshold = (g->gc.estimate/100) * g->gc.pause;

    g->gc.estimate为当前实际使用的内存的大小,如果gc.pause为200,则该段代码表示,设置gc的阈值为当前实际使用内存的2倍

  • “setstepmul”:设置回收器的步进乘数,并返回原值。该值代表每次自动step的步长倍率,影响每次gc step的速率,具体这么影响可以查看后面小节

参考:https://www.cnblogs.com/gangtie/p/12724295.html