Lua的GC机制
GC分析:
lua中GC采用的是标记-清除法,即一次GC分为2步
1:从根结点遍历GC对象,如果可达则标记
2:遍历所有的GC对象,清除所有未被标记的对象
二色标记法:
lua5.1之前采用的GC算法,缺点是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的速率,具体这么影响可以查看后面小节