首页 > 其他分享 >Lua 垃圾回收

Lua 垃圾回收

时间:2024-12-11 10:29:23浏览次数:10  
标签:collectgarbage 收集器 回收 Lua 内存 步进 垃圾

Lua 采用了自动内存管理。 这意味着你不用操心新创建的对象需要的内存如何分配出来, 也不用考虑在对象不再被使用后怎样释放它们所占用的内存。

Lua 运行了一个垃圾收集器来收集所有死对象 (即在 Lua 中不可能再访问到的对象)来完成自动内存管理的工作。 Lua 中所有用到的内存,如:字符串、表、用户数据、函数、线程、 内部结构等,都服从自动管理。

Lua 实现了一个增量标记-扫描收集器。 它使用这两个数字来控制垃圾收集循环: 垃圾收集器间歇率和垃圾收集器步进倍率。 这两个数字都使用百分数为单位 (例如:值 100 在内部表示 1 )。

垃圾收集器间歇率控制着收集器需要在开启新的循环前要等待多久。 增大这个值会减少收集器的积极性。 当这个值比 100 小的时候,收集器在开启新的循环前不会有等待。 设置这个值为 200 就会让收集器等到总内存使用量达到 之前的两倍时才开始新的循环。

垃圾收集器步进倍率控制着收集器运作速度相对于内存分配速度的倍率。 增大这个值不仅会让收集器更加积极,还会增加每个增量步骤的长度。 不要把这个值设得小于 100 , 那样的话收集器就工作的太慢了以至于永远都干不完一个循环。 默认值是 200 ,这表示收集器以内存分配的"两倍"速工作。

如果你把步进倍率设为一个非常大的数字 (比你的程序可能用到的字节数还大 10% ), 收集器的行为就像一个 stop-the-world 收集器。 接着你若把间歇率设为 200 , 收集器的行为就和过去的 Lua 版本一样了: 每次 Lua 使用的内存翻倍时,就做一次完整的收集。


垃圾回收器函数

Lua 提供了以下函数collectgarbage ([opt [, arg]])用来控制自动内存管理:

  • collectgarbage("collect"): 做一次完整的垃圾收集循环。通过参数 opt 它提供了一组不同的功能:

  • collectgarbage("count"): 以 K 字节数为单位返回 Lua 使用的总内存数。 这个值有小数部分,所以只需要乘上 1024 就能得到 Lua 使用的准确字节数(除非溢出)。

  • collectgarbage("restart"): 重启垃圾收集器的自动运行。

  • collectgarbage("setpause"): 将 arg 设为收集器的 间歇率。 返回 间歇率 的前一个值。

  • collectgarbage("setstepmul"): 返回 步进倍率 的前一个值。

  • collectgarbage("step"): 单步运行垃圾收集器。 步长"大小"由 arg 控制。 传入 0 时,收集器步进(不可分割的)一步。 传入非 0 值, 收集器收集相当于 Lua 分配这些多(K 字节)内存的工作。 如果收集器结束一个循环将返回 true 。

  • collectgarbage("stop"): 停止垃圾收集器的运行。 在调用重启前,收集器只会因显式的调用运行。

以下演示了一个简单的垃圾回收实例:

实例

mytable = {"apple", "orange", "banana"}

print(collectgarbage("count"))

mytable = nil

print(collectgarbage("count"))

print(collectgarbage("collect"))

print(collectgarbage("count"))

执行以上程序,输出结果如下(注意内存使用的变化):

20.9560546875
20.9853515625
0
19.4111328125

标签:collectgarbage,收集器,回收,Lua,内存,步进,垃圾
From: https://blog.csdn.net/jiangzhmi/article/details/144373707

相关文章

  • Lua 调试(Debug)
    Lua提供了debug库用于提供创建我们自定义调试器的功能。Lua本身并未有内置的调试器,但很多开发者共享了他们的Lua调试器代码。Lua中debug库包含以下函数:序号方法&用途1.debug():进入一个用户交互模式,运行用户输入的每个字符串。使用简单的命令以及其它调试设置,用......
  • Lua 错误处理
    程序运行中错误处理是必要的,在我们进行文件操作,数据转移及webservice调用过程中都会出现不可预期的错误。如果不注重错误信息的处理,就会造成信息泄露,程序无法运行等情况。任何程序语言中,都需要错误处理。错误类型有:语法错误运行错误语法错误语法错误通常是由于对程序的......
  • 不会Lua又想Open开发,看我教你!
    看我教你open开发!首先Lua先学起来,再看LuatOS具体应用示例,十分容易上手,大家可以参照本教程。Lua视频教程无废话30分钟Lua快速入门教程:https://b23.tv/DMaAHQ1LuatOS文档教程资料中心:https://docs.openluat.comLuatOS支持的主要模组型号:Air780E/Air780EX/Air780EP/Air780EPS......
  • Redis篇-1--入门介绍(内存,I/O模型分类,I/O多路复用,redis事务,redis发布/订阅,单线程模型,Lu
    1、Redis概述‌Redis(RemoteDictionaryServer),全称为远程字典服务。‌是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。Redis提供了多种数据类型的存储,来适应不同场景下的存储需求。并提供多种语言的API,兼容多种方式的集成。Red......
  • 垃圾溢出监测识别摄像机
    垃圾溢出监测识别摄像机是一种应用于城市环境管理的智能设备,它能够帮助城市管理部门实时监测垃圾桶的填充情况,及时发现溢出情况并作出响应。该设备通常采用计算机视觉技术,结合图像识别算法,能够准确地识别垃圾桶的填充程度和溢出情况。在实际使用中,垃圾溢出监测识别摄像机首先会......
  • springboot毕设基于框架的生活垃圾识别与处理的科普网站源码+论文+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着社会的发展和人口的增长,生活垃圾的产生量日益增多,这对环境和人类健康都带来了诸多挑战。传统的垃圾处理方式面临着效率低下、分类不准确等问......
  • springboot整合lua脚本在Redis实现商品库存扣减
    1、目的        使用lua脚本,可以保证多条命令的操作原子性;同时可以减少操作IO(比如说判断redis对应数据是否小于0,小于0就重置为100,这个场景一般是取出来再判断,再存放进行,就至少存在2次IO,用lua脚本一条命令1次IO就解决了,在批量扣减情况存在多次IO,lua脚本1次也可以解决......
  • 旧衣物回收小程序搭建,便捷回收,绿色生活!
    随着人们生活水平的提高,各种衣物的更新速度逐渐加快,为了减少衣物的浪费,旧衣物回收市场受到了人们的关注。如今,旧衣物回收行业的技术正在不断创新,利用科技的发展,结合了互联网的模式,提高了回收的效率,降低企业回收成本,推动行业进一步发展,同时也能够为行业提供巨大的发展空间。旧......
  • 基于java ssm家用电器上门回收系统回收分配订单(源码+文档+运行视频+讲解视频)
     文章目录系列文章目录目的前言一、详细视频演示二、项目部分实现截图三、技术栈后端框架SSM前端框架vueSSM框架详细介绍系统测试四、代码参考源码获取目的摘要: 本文论述基于JavaSSM框架构建的家用电器上门回收系统。该系统在推动资源循环利用和环保事业中发挥着......
  • springboot玩具回收与租借系统-计算机毕业设计源码47829
    目 录摘要1绪论1.1研究背景1.2课题意义2 玩具回收与租借系统系统分析2.1可行性分析2.1.1技术可行性分析2.1.2经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3系统用例分析2.4系统流程分析2......