Lua - 垃圾收集


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

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

Lua 使用垃圾收集器,当 Lua 程序不再访问死对象时,该垃圾收集器会不时运行来收集死对象。

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

垃圾收集器暂停

垃圾收集器暂停用于控制垃圾收集器之前需要等待多长时间;它被Lua的自动内存管理再次调用。值小于100意味着Lua不会等待下一个周期。同样,该值较高会导致垃圾收集器速度缓慢且攻击性较小。值为 200 意味着收集器等待正在使用的总内存加倍,然后再开始新的循环。因此,根据应用程序的性质和速度,可能需要更改此值以获得 Lua 应用程序的最佳性能。

垃圾收集器步骤乘数

该步骤乘数控制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解释器也会在预定义的时间之后自动执行它们。

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