📜  Lua-垃圾收集

📅  最后修改于: 2020-10-16 05:17:51             🧑  作者: Mango


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

  • 无需担心为对象分配内存。
  • 除了将其设置为nil之外,无需再释放它们。

当不再可以从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”) -运行一步垃圾收集。第二个参数越大,此步骤将越大。如果触发的步骤是垃圾收集周期的最后一步,则收集垃圾将返回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解释器在以后的阶段自动执行。

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