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

Lua 垃圾回收

时间:2023-06-19 21:46:26浏览次数:29  
标签:collectgarbage 收集器 回收 Lua 内存 步进 垃圾

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://www.cnblogs.com/hcgk/p/17492268.html

相关文章

  • Lua 面向对象
    Lua面向对象面向对象编程(ObjectOrientedProgramming,OOP)是一种非常流行的计算机编程架构。以下几种编程语言都支持面向对象编程:所谓的面向对象不过是把数据结构的组织,把零散的方法和变量封装成一个整体,组件化从而可以组建成更加庞大的体系构建世界万物。不要过度迷信面向对......
  • Lua 文件
    Lua文件I/Olua常用的就是内存操作,和redis,mysql,kafka中间件打通。LuaI/O库用于读取和处理文件。分为简单模式(和C一样)、完全模式。简单模式(simplemodel)拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作。完全模式(completemodel)使用外部的文件句......
  • Lua 元表
    Lua元表(Metatable)在Luatable中我们可以访问对应的key来得到value值,但是却无法对两个table进行操作(比如相加)。因此Lua提供了元表(Metatable),允许我们改变table的行为,每个行为关联了对应的元方法。例如,使用元表我们可以定义Lua如何计算两个table的相加操作......
  • Lua 协同程序
    Lua协同程序(coroutine)目前来说基本用不到,暂时记录什么是协同(coroutine)?Lua协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。协同是非常强大的功能,但是用起来也很复杂。线程和协同程......
  • Lua 模块与包
    Lua模块与包模块类似于一个封装库,从Lua5.1开始,Lua加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以API接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。Lua的模块是由变量、函数等已知元素组成的table,因此创建一个模块很简单,就是创建一......
  • Lua语言- 1
    0-Lua语言介绍特性轻量级:它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。可扩展:Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。其它特性:支持面向过程(proce......
  • 关于Linux系统下Lua编程运行环境的部署安装
    这里以操作系统:RedHatEnterpriseLinuxrelease8.7(Ootpa)为例,讲解如下部署Lua编程脚本的运行环境首先对于Lua脚本,需要保证系统中有lua二进制程序文件,即/usr/bin/lua但最小化安装的Linux- RedHatEnterpriseLinuxrelease8.7(Ootpa) 笔者试了一下,没有lua命令了 ......
  • 一文搞懂V8引擎的垃圾回收机制
    前言我们平时在写代码的过程中,好像很少需要自己手动进行垃圾回收,那么V8是如何来减少内存占用,从而避免内存溢出而导致程序崩溃的情况的。为了更高效地回收垃圾,V8引入了两个垃圾回收器,它们分别针对不同场景进行工作。垃圾从何而来我们先来搞清楚这些‘垃圾’是怎么产生的不管使用哪一......
  • Lua 中如何实现继承
    本文主要参考了菜鸟教程中的Lua面向对象,再加上自己学习过程的中思考,特此记录,如果文中有不对的地方,请不吝赐教。这里就不在介绍面向对象的基本思想了,主要讲一讲Lua中如何实现继承,包括单继承和多继承。1、如何定义一个类我们知道,对象由属性和方法组成。Lua中最基本的结构......
  • 删除docker环境里jupyter下的回收站文件
    linux下的回收站文件夹在:~/.local/share/Trash/files/*删除docker里jupyterlablinux环境下的回收站文件,我的docker默认安装目录是:/data/docker/rm-rf/data/docker/overlay2/*/merged/root/.local/share/Trash/files/* 设置不进回收站vim.jupyter/jupyter_lab_confi......