Lua垃圾回收机制

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访问过,但该对象引用的其它对象还未标记

黑色:不可回收的对象

清理流程

c 复制代码
将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状态;
}
相关推荐
郑州光合科技余经理9 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1239 天前
matlab画图工具
开发语言·matlab
dustcell.9 天前
haproxy七层代理
java·开发语言·前端
norlan_jame9 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone9 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ4022054969 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
遥遥江上月9 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js
m0_531237179 天前
C语言-数组练习进阶
c语言·开发语言·算法
Railshiqian9 天前
给android源码下的模拟器添加两个后排屏的修改
android·开发语言·javascript
雪人不是菜鸡9 天前
简单工厂模式
开发语言·算法·c#