Lua内存管理机制

Lua 使用的是垃圾自动回收机制。

Lua 主要是通过运行一个垃圾收集器来收集所有垃圾(Lua 中不会被访问到但还没销毁的对象)以完成自动内存管理的工作。

Lua的垃圾清理过程由4个阶段组成:标记、整理、清扫和收尾。

  1. 标记阶段:Lua先将“根集合”中的对象标记为“活跃”。根集合中的对象就是Lua可以直接访问的对象,它们是注册表中的对象和主线程对象。然后,Lua将任何程序可以通过根集合对象访问到的对象也都标记为“活跃”。这样会使所有可到达的对象都标记为“活跃”了。
  2. 整理阶段:Lua遍历所有的userdata,找出所有未被标记且具有–gc元方法的userdata。然后,将这些userdata标记为“活跃”,并放入一个单独的列表中。这个列表在收尾阶段会用到。另一方面,Lua还会遍历所有的弱引用table,并根据弱引用设置删除其中未被标记的key和value。
  3. 清扫阶段:Lua遍历所有的对象。如果当前遍历到的对象未被标记,就收集它。否则,Lua就清除它的标记,从而为下一个收集周期做准备。
  4. 收尾阶段:Lua根据整理阶段中生成的userdata列表来调用它们的终结函数,在最后才进行这些调用是为了简化错误处理。

Lua垃圾回收函数

  • collectgarbage("collect"): 做一次完整的垃圾收集循环。
  • collectgarbage("count"): 以 K 字节数为单位返回 Lua 使用的总内存数。
  • collectgarbage("restart"): 重启垃圾收集器的自动运行。
  • collectgarbage("setpause"): 将 arg 设为收集器的 间歇率。 返回 间歇率 的前一个值。垃圾收集器间歇率控制着收集器需要在开启新的循环前要等待多久。 增大这个值会减少收集器的积极性。 当这个值比 100 小的时候,收集器在开启新的循环前不会有等待。 设置这个值为 200 就会让收集器等到总内存使用量达到 之前的两倍时才开始新的循环。
  • collectgarbage("setstepmul"): 返回 步进倍率 的前一个值。垃圾收集器步进倍率控制着收集器运作速度相对于内存分配速度的倍率。 增大这个值不仅会让收集器更加积极,还会增加每个增量步骤的长度。 不要把这个值设得小于 100 , 那样的话收集器就工作的太慢了以至于永远都干不完一个循环。 默认值是 200 ,这表示收集器以内存分配的"两倍"速工作。
  • collectgarbage("step"): 单步运行垃圾收集器。 步长"大小"由 arg 控制。 传入 0 时,收集器步进一步。 传入非 0 值, 收集器收集相当于 Lua 分配这些多(K 字节)内存的工作。 如果收集器结束一个循环将返回 true 。
  • collectgarbage("stop"): 停止垃圾收集器的运行。 在调用重启前,收集器只会因显式的调用运行。

参考链接

https://www.runoob.com/lua/lua-garbage-collection.html

https://zhuanlan.zhihu.com/p/25130378

Lua基础之垃圾回收相关推荐

  1. 嵌入式lua之多线程操作移植四 lua线程结束垃圾回收

    继续上文做一些细节补充. lua多线程锁 1.上章节中使用的锁为全局锁,如下: #if !defined(lua_lock) extern void hx_lua_lock(); extern voi ...

  2. Lua语言学习-垃圾回收

    菜鸟教程 https://www.runoob.com/lua/lua-garbage-collection.html Lua 采用了自动内存管理,当一个变量不再使用,或者我们在变量不被引用的前提下主 ...

  3. 【JVM基础】垃圾回收算法详解(引用计数、标记、清除、压缩、复制)

    前言 笔记参考 Java 全栈知识体系.星羽恒.星空茶 文章目录 前言 垃圾回收概述 引用计数法 案例 优点 缺点 标记.清除.压缩 标记 清除 压缩 标记清除算法 优点 缺点 标记压缩算法 优点 缺 ...

  4. Lua中的垃圾回收机制

    遇到问题: 在运行lua脚本时,出现下面报错说内存不足: >lua -e "io.stdout:setvbuf 'no'" "最大值最小值检查.lua" ...

  5. Lua语法知识点 垃圾回收collectgarbage

    Lua垃圾回收只有一个函数collectgarbage,第一个参数是字符串,代表操作类型,第二个参数只有某些操作有,是该操作所需要的参数. 操作类型: stop停止垃圾收集. restart重启垃圾收 ...

  6. java基础之垃圾回收_繁星漫天_新浪博客

    在java中,当一个对象成为垃圾后仍会占用内存空间,时间一长,就会导致内存空间的不足.针对这种情况,java中引入了垃圾回收机制.程序员不需要过多的关心垃圾对象回收的问题,java虚拟机会自动回收垃圾 ...

  7. Java基础:JVM垃圾回收算法

    众所周知,Java的垃圾回收是不需要程序员去手动操控的,而是由JVM去完成.本文介绍JVM进行垃圾回收的各种算法. 1. 如何确定某个对象是垃圾 1.1. 引用计数法 1.2. 可达性分析 2. 典型 ...

  8. JavaScript基础09-day11【原型对象、toString()、垃圾回收、数组、数组字面量、数组方法】

    学习地址: 谷粒学院--尚硅谷 哔哩哔哩网站--尚硅谷最新版JavaScript基础全套教程完整版(140集实战教学,JS从入门到精通) JavaScript基础.高级学习笔记汇总表[尚硅谷最新版Ja ...

  9. Java垃圾回收机制(Garbage Collection)

    引用博客地址:http://www.cnblogs.com/ywl925/p/3925637.html 以下两篇博客综合描述Java垃圾回收机制 第一篇:说的比较多,但是不详细 http://www. ...

最新文章

  1. Mui Webview下来刷新上拉加载实现
  2. C++平衡二叉树(AVL树)
  3. JLBH示例2 –协调遗漏的会计处理
  4. 移动端根据设计稿宽度适配 px转换相对单位rem
  5. 什么样的合作方式最舒服
  6. otn系统中常用的电层_夏季温室大棚生产中常用的降温系统
  7. 8位深, 16位深,24位深,32位深图片显示原理及对比
  8. win7与winxp双系统安装后的引导过程
  9. 你觉得jQuery源码中有哪些写得好的地方?
  10. 经典软件架构设计模式
  11. 电脑win10计算机图标,告诉你如何显示win10计算机图标
  12. Coursera 申请助学金流程和材料
  13. ST-LINK Utility + ST LINK+ STM32G474 erase chip fails
  14. 快速开发平台——运用它就可以高效率开发出合乎自己需求的应用软件。
  15. Deepin 系统启动kettle(Pentaho )
  16. 软件测试理论与经验--阅读笔记
  17. 如何停止VBS永久循环
  18. 2021年美容师(初级)最新解析及美容师(初级)考试资料
  19. HTPC知识普及第三讲:高清软硬解之争
  20. 2020级C语言大作业 - 三国杀

热门文章

  1. java 读取远程文件并让浏览器下载
  2. npmXLSX解析表格内容
  3. 靶机渗透练习54-digitalworld.local:DEVELOPMENT
  4. 万字长文:带你走进shell世界
  5. c语言读取.ppm文件,孙其功陪你学之——C语言读取.ppm文件
  6. 思维随想录--ChatGPT商业预见
  7. 人才市场-冲刺日志(第三天)
  8. 推荐20套适合python下django框架的毕业设计毕设课题
  9. [导入]自己编写QQ挂机软件--基于HTTP的QQ协议之我所见
  10. 基因序列相似度(LCS)