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