Lua - 垃圾回收

  • 简述

    Lua 使用自动内存管理,该管理基于 Lua 内置的某些算法使用垃圾收集。作为自动内存管理的结果,作为开发人员 -
    • 无需担心为对象分配内存。
    • 除了将其设置为 nil 之外,不再需要时无需释放它们。
    Lua 使用垃圾收集器,该收集器会不时运行以在 Lua 程序无法再访问死对象时收集它们。
    包括表、用户数据、函数、线程​​、字符串等在内的所有对象都受到自动内存管理。Lua 使用增量标记和清除收集器,它使用两个数字来控制其垃圾收集周期,即garbage collector pausegarbage collector step multiplier. 这些值以百分比表示,100 的值通常在内部等于 1。
  • 垃圾收集器暂停

    垃圾收集器暂停用于控制垃圾收集器需要等待多长时间,之前;Lua 的自动内存管理会再次调用它。小于 100 的值意味着 Lua 不会等待下一个周期。类似地,该值的较高值将导致垃圾收集器在本质上变慢且不那么积极。值 200 表示收集器在开始新循环之前等待正在使用的总内存翻倍。因此,根据应用程序的性质和速度,可能需要更改此值以在 Lua 应用程序中获得最佳性能。
  • 垃圾收集器步进倍增器

    这个step multiplier控制垃圾收集器相对于Lua程序内存分配的速度。较大的步长值将导致垃圾收集器更加激进,并且还会增加垃圾收集的每个增量步长的步长。小于 100 的值通常会导致避免垃圾收集器无法完成其循环,并且通常不是首选。默认值为 200,这意味着垃圾收集器以内存分配速度的两倍运行。
  • 垃圾收集器函数

    作为开发人员,我们确实可以控制 Lua 中的自动内存管理。为此,我们有以下方法。
    • collectgarbage("collect") − 运行一个完整的垃圾收集周期。
    • collectgarbage("count") − 返回程序当前使用的内存量(以千字节为单位)。
    • collectgarbage("restart") − 如果垃圾收集器已停止,则重新启动它。
    • collectgarbage("setpause")- 将作为第二个参数的值除以 100 设置为垃圾收集器暂停变量。它的用途正如上面讨论的那样。
    • collectgarbage("setstepmul")- 将作为第二个参数给出的值除以 100 设置为垃圾步骤乘数变量。它的用途正如上面讨论的那样。
    • collectgarbage("step")− 运行一步垃圾收集。第二个参数越大,这一步就越大。如果触发的步骤是垃圾收集周期的最后一步,则 collectgarbage 将返回 true。
    • collectgarbage("stop") - 如果垃圾收集器正在运行,则停止垃圾收集器。
    下面显示了一个使用垃圾收集器示例的简单示例。
    
    mytable = {"apple", "orange", "banana"}
    print(collectgarbage("count"))
    mytable = nil
    print(collectgarbage("count"))
    print(collectgarbage("collect"))
    print(collectgarbage("count"))
    
    当我们运行上面的程序时,我们将得到以下输出。请注意,此结果会因操作系统类型的不同以及 Lua 的自动内存管理功能而有所不同。
    
    23.1455078125   149
    23.2880859375   295
    0
    22.37109375     380
    
    你可以在上面的程序中看到,一旦垃圾收集完成,它就减少了使用的内存。但是,调用它不是强制性的。即使我们不调用它们,它也会在预定义的时间段后由 Lua 解释器在稍后阶段自动执行。
    显然,如果需要,我们可以使用这些函数更改垃圾收集器的行为。这些函数为开发人员处理复杂情况提供了一些额外的能力。根据程序需要的内存类型,您可能会或可能不会使用此功能。但是了解应用程序中的内存使用情况并在编程期间检查它是非常有用的,以避免部署后出现不希望的结果。