Lua垃圾回收机制

z2014z 2024-09-17 16:07:04 阅读 92

Lua垃圾回收机制

在 Lua 中,一共只有8种数据类型,分别为 nil 、boolean 、userdata 、number 、string 、 table 、 function 、 userdata 和 thread 。其中,只有 string table function thread 四种是以引用方式共享,是需要被 GC 管理回收的对象

Lua采用了标记清除式(Mark and Sweep)GC算法,算法简述:

标记:每一次执行GC前,从根节点开始遍历每一个相关节点,进行标记

清除:标记完成后,遍历对象链表,然后对需要执行清除标记的对象,进行清除

使用三色法:白,灰,黑,作为对象的三种状态

新白:可以回收的对象;新创建的对象,初始状态是新白,但不会被清除

旧白:可以回收的对象;lua只会清除旧白,GC后,会更新新白

灰色:等待回收的对象:该对象已被GC访问过,但该对象引用的其它对象还未标记

黑色:不可回收的对象

清理流程

<code>将root集合引用到的对象从White设置成Gray,并放到Gray集合中;

while(Gray集合不为空,并且没有超过本次计算量的上限)

{

从Gray集合中移除一个对象O,并将O设置成Black状态;

for(O中每一个引用到的对象O1) {

if(O1在White状态) {

将O1从White设置成Gray,并放到到Gray集合中;

}

}

}

for(任意一个对象O){

if(O在White状态)

销毁对象O;

else

将O设置成White状态;

}



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。