Lua - 垃圾回收

Lua 使用自动内存管理,该管理使用基于 Lua 内置的某些算法的垃圾收集。 作为自动内存管理的结果,作为开发人员 −

  • 无需担心为对象分配内存。
  • 不再需要时不需要释放它们,除非将其设置为 nil。

Lua 使用不时运行的垃圾收集器来收集无法从 Lua 程序访问的死对象。

所有对象,包括表、用户数据、函数、线程、字符串等,都受到自动内存管理。 Lua 使用增量标记和清除收集器,它使用两个数字来控制其垃圾收集周期,即 垃圾收集器暂停垃圾收集器步长乘数。 这些值以百分比表示,100 的值通常在内部等于 1。


垃圾收集器暂停

垃圾收集器 Pause 暂停用于控制垃圾收集器需要等待多长时间; 它被 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 解释器在稍后阶段自动执行。

显然,如果需要,我们可以使用这些函数来改变垃圾收集器的行为。 这些功能为开发人员提供了一些额外的能力来处理复杂的情况。 根据程序所需的内存类型,您可能会或可能不会使用此功能。 但是了解应用程序中的内存使用情况并在编程过程中检查它是非常有用的,以避免部署后出现不希望的结果。