Lua - 垃圾收集

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") : 运行垃圾收集的一步.第二个参数越大,此步骤就越大.如果触发的步骤是垃圾收集周期的最后一步,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解释器在稍后阶段自动执行.

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