collectgarbage ([opt [, arg]])
!subtitle:说明
此函数是垃圾收集的通用接口,根据 opt 参数执行不同功能:
!subtitle:参数
opt - 要执行的功能,默认为 "collect"
"collect" - 执行完整的垃圾收集周期
"stop" - 停止自动执行垃圾收集
"restart" - 重新启动自动执行垃圾收集
"count" - 返回 Lua 实际使用的内存总量,单位为 KiB
"step" - 执行垃圾收集步骤,可通过减小 arg 参数降低卡顿
arg 为 0 时执行一个基本(不可分割)步骤
arg 大于 0 时执行的的步骤数相当于分配 arg KiB 内存时触发的回收步骤数
"isrunning" - 检查是否自动执行垃圾收集
"incremental - 将垃圾收集器设为 增量模式,可以后跟三个参数:
垃圾收集器的暂停参数
垃圾收集器的步长乘数
垃圾收集器的步长
"generational" - 将垃圾收集器设为 分代模式,可以后跟两个参数:
垃圾收集器的次要乘数
垃圾收集器的主要乘数
!subtitle:返回值
由 opt 决定:
"count" - 返回 Lua 实际使用的内存总量,单位为 KiB
"step" - 返回是否恰好完成了一个完整的垃圾收集周期
"isrunning" - 返回是否启用了自动垃圾收集
"incremental" - 返回之前的模式
"generational" - 返回之前的模式
-- 开关自动垃圾收集
print("是否启用自动垃圾收集", collectgarbage("isrunning"))
collectgarbage("stop") -- 停止自动执行垃圾收集
print("是否启用自动垃圾收集", collectgarbage("isrunning"))
collectgarbage("restart") -- 重新启用自动执行垃圾收集
print("是否启用自动垃圾收集", collectgarbage("isrunning"))
-- 检查内存用量
print("Lua 当前使用的内存总量为", collectgarbage("count"), "KiB")
在增量模式下,每个 GC 周期都会以小步长执行标记-清除收集,并与程序执行交错进行。在此模式下,收集器使用三个数字来控制其垃圾收集周期:垃圾收集器暂停参数、垃圾收集器步长乘数和垃圾收集器步长。
垃圾收集器暂停参数 控制着收集器在开始新一轮循环之前的等待时间。当内存使用量达到上次收集后的 \(n\%\) 时,收集器将启动新一轮循环。值越大,收集器的积极性越低。小于或等于 100 的值表示收集器不会等待启动新一轮循环。值为 200 表示收集器将等待总内存使用量翻倍后再启动新一轮循环。默认值为 200;最大值为 1000。
垃圾收集器步长乘数 控制着垃圾收集器相对于内存分配的速度,即每分配 KB 内存标记或清除的元素数量。较大的值会使垃圾收集器更加积极,但也会增加每个增量步长的大小。不应使用小于 100 的值,因为这会使垃圾收集器速度过慢,并可能导致垃圾收集器无法完成一个循环。默认值为 100;最大值为 1000。
垃圾收集器步长 控制每个增量步骤的大小,具体来说就是解释器在执行每个步骤之前分配的字节数。此参数是对数的:值为 n 表示解释器将在每个步骤之间分配 \(2^n\) 个 字节,并在该步骤中执行等效的工作。较大的值(例如 60)会使收集器成为 Stop-the-world(非增量)收集器。默认值为 13,表示步长约为 8 KB。
在分代模式下,收集器会频繁执行小回收,仅遍历最近创建的对象。如果小回收后内存使用量仍然超出限制,收集器会执行一次“stop-the-world”大回收,遍历所有对象。分代模式使用两个参数:次要乘数和主要乘数。
次要乘数 控制次要回收的频率。如果次要乘数为 x ,则当内存使用量比上一次主要回收后增加 \(x\%\) 时,将执行新的次要回收。例如,如果倍数为 20,则当内存使用量比上一次主要回收后增加 \(20\%\) 时,收集器将执行一次次要回收。默认值为 20;最大值为 200。
主要乘数 控制主要回收的频率。如果主要乘数为 x ,则当内存使用量比上一次主回收后增加 \(x\%\) 时,将执行一次新的主要回收。例如,如果倍数为 100,则当内存使用量比上一次回收后增加两倍时,垃圾收集器将执行一次主回收。默认值为 100;最大值为 1000。
collectgarbage - Lua 5.4 Reference Manual