lua的gc原理

lua垃圾回收(Garbage Collect)是lua中一个比较重要的部分。由于lua源码版本变迁,目前大多数有关这个方面的文章都还是基于lua5.1版本,有一定的滞后性。因此本文通过参考当前的5.3.4版本的Lua源码,希望对Lua的GC算法有一个较为详尽的探讨。

Lua的垃圾回收器使用了三色标记算法,这是一种基于标记-清除(mark-and-sweep)的改进算法。它引入了三种颜色来描述对象的状态,以提高垃圾回收的效率和性能。

三色标记算法的三种颜色是:

  1. 白色(White):初始状态下,所有的对象都被假设为白色,表示这些对象是未访问的、未标记的。

  2. 灰色(Gray):表示对象已被访问,但其引用的其他对象尚未被标记。灰色对象可能有指向白色对象的引用,即它们是待处理的对象。

  3. 黑色(Black):表示对象已被访问并且其引用的其他对象也已被标记。黑色对象及其引用的所有对象都是被标记为活跃对象,不会被垃圾回收。

Lua的三色标记算法流程如下:

  1. 初始标记阶段:从根集合(如全局变量、栈、寄存器等)开始,将根集合中的对象标记为黑色,并将其引用的对象标记为灰色。这个阶段是一个快速的标记过程,它只标记直接可达的对象。

  2. 追踪阶段:在初始标记后,垃圾回收器继续遍历灰色对象,将它们标记为黑色,同时将它们引用的白色对象变为灰色。这个过程会不断追踪、探索灰色对象的引用链,直到所有可达的对象都被标记为黑色。

  3. 清除阶段:清除阶段会回收所有未标记(仍然是白色)的对象,释放它们占用的内存空间。这些未被标记的对象被认为是不可达的,因此可以安全地回收其所占用的内存。

  4. 内存整理(可选):在清除阶段之后,可能会对内存空间进行整理,例如合并连续的内存块或重新组织内存布局,以便在后续的内存分配中更有效地利用空闲块。

备注:白色分为白1和白2。原因:在GC标记阶段结束而清除阶段尚未开始时,如果新建一个对象,由于其未被发现引用关系,原则上应该被标记为白色,于是之后的清除阶段就会按照白色被清除的规则将新建的对象清除。这是不合理的。于是lua用两种白色进行标识,如果发生上述情况,lua依然会将新建对象标识为白色,不过是“当前白”(比如白1)。而lua在清扫阶段只会清扫“旧白”(比如白2),在清扫结束之后,则会更新“当前白”,即将白2作为当前白。下一轮GC将会清扫作为“旧白”的白1标识对象。通过这样的一个技巧解决上述的问题。如下图:(下图中为了方便颜色变换的理解,没有考虑barrier的影响)

三色标记算法通过将对象分为三种状态,减少了标记和追踪过程中对整个对象图的遍历次数,提高了垃圾回收的效率。它的主要优势在于其增量式标记和回收策略,使得垃圾回收过程可以分散到多个小步骤中,降低了垃圾回收对系统造成的停顿时间。

参考:

Lua GC机制分析与理解-上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/224959.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】每日一题 2023_11_28 设计前中后队列(数组/链表/双端队列)

文章目录 刷题前唠嗑题目:设计前中后队列题目描述代码与解题思路偷看大佬题解 结语 刷题前唠嗑 LeetCode?启动!!! 这道题的难度,才是我想象中的中等题的难度好吧,昨天那玩意对我来说还是太难了…

9个AI视频后期处理神器——Runway 全功能超详细使用教程(3)

前面2期内容,主要给大家重点介绍了Runway视频生成技术的核心产品功能板块Gen1、Gen2、FI使用教程,还没有看过的小伙伴可以回看往期文章。除了视频生成AI技术外,Runway还具有图片、视频后期处理30多项单个功能,例如视频修复、视频主…

封装可多选的组件(Autocomplete)

一。组件库Material UI 1.1 地址 https://v4.mui.com/zh/getting-started/installation/ 1.2 简介 自称世界上最受欢迎的React UI组件库(能看到这里的基本用法应该都清楚了,我就不重复了) 二。效果展示 三。代码展示 import React from reactimport { useField, us…

阿里云ACE认证之国际版与国内版对比!

大厂疯狂裁员,互联网行业迎来寒冬,技术人员被动陷入疯狂内卷。在愈加内卷的IT领域,“云计算”作为少有的蓝海,无疑是打工人未来实现职场提升、摆脱内卷的绝佳选择! 对于云计算行业的人来说,最值得考的肯定是…

rust-flexi_logger

flexi_logger 是字节开源的rust日志库。目前有log4rs、env_log 等库,综合比较下来,还是flexi_logger简单容易上手,而且自定义很方便,以及在效率方面感觉也会高,下篇文章我们来测试下。 下面来看下怎么使用 关注 vx gol…

jq+canvas:实现图片上传+裁剪+保存等功能

效果图 上传图片之前&#xff1a; 上传图片之后&#xff0c;点击放大/缩小后的效果&#xff1a; 裁剪之后的效果&#xff1a; 代码实现如下&#xff1a; 1.html部分 <input type"file" id"fileInput" accept"image/png, image/gif, image/j…

Python提取PDF表格(基于AUTOSAR_SWS_CANDriver.pdf)

个人学习笔记&#xff0c;仅供参考。 需求&#xff1a;提取AUTOSAR SWS中所有的API接口信息&#xff0c;用于生成C代码。 此处以AUTOSAR_SWS_CANDriver.pdf为例&#xff0c;若需要提取多个SWS文件&#xff0c;遍历各个文件即可。 1.Python包 pdfplumber是一款完全用python开…

【FMC139】青翼科技基于VITA57.1标准的4路500MSPS/1GSPS/1.25GSPS采样率14位AD采集FMC子卡模块

板卡概述 FMC139是一款基于VITA57.1标准规范的JESD204B接口FMC子卡模块&#xff0c;该模块可以实现4路14-bit、500MSPS/1GSPS ADC采集功能。该板卡ADC器件采用ADI公司的AD9680芯片,全功率-3dB模拟输入带宽可达2GHz。该ADC与FPGA的主机接口通过8通道的高速串行GTX收发器进行互联…

SpringCloud-高级篇(五)

一&#xff1a;分布式事务理论基础 原子性&#xff08;Atomicity&#xff09; 原子性是指事务是一个不可分割的工作单位&#xff0c;事务中的操作要么都发生&#xff0c;要么都不发生。 一致性&#xff08;Consistency&#xff09; 事务前后数据的完整性必须保持一致。 隔离性&…

计算机服务器中了mallox勒索病毒如何处理,mallox勒索病毒解密文件恢复

科技技术的发展推动了企业的生产运营&#xff0c;网络技术的不断应用&#xff0c;极大地方便了企业日常生产生活&#xff0c;但网络毕竟是一把双刃剑&#xff0c;网络安全威胁一直存在&#xff0c;近期&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的计算机…

【离散数学】——期末刷题题库(命题逻辑)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

使用opencv的matchTemplate进行银行卡卡号识别

![字体文件](https://img-blog.csdnimg.cn/3a16c87cf4d34aceb0778c4b20ddadb2.png#pic_center import cv2 import numpy as npdef show_img(img, name"temp"):img cv2.resize(img, (0, 0), fx3, fy3)cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()de…