2329

12 分钟

#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")

>>> Establishing WebAssembly Runtime.

>>> Standby.

Powered by Shift.

#增量模式

在增量模式下,每个 GC 周期都会以小步长执行标记-清除收集,并与程序执行交错进行。在此模式下,收集器使用三个数字来控制其垃圾收集周期:垃圾收集器暂停参数垃圾收集器步长乘数垃圾收集器步长

垃圾收集器暂停参数 控制着收集器在开始新一轮循环之前的等待时间。当内存使用量达到上次收集后的 时,收集器将启动新一轮循环。值越大,收集器的积极性越低。小于或等于 100 的值表示收集器不会等待启动新一轮循环。值为 200 表示收集器将等待总内存使用量翻倍后再启动新一轮循环。默认值为 200;最大值为 1000。

垃圾收集器步长乘数 控制着垃圾收集器相对于内存分配的速度,即每分配 KB 内存标记或清除的元素数量。较大的值会使垃圾收集器更加积极,但也会增加每个增量步长的大小。不应使用小于 100 的值,因为这会使垃圾收集器速度过慢,并可能导致垃圾收集器无法完成一个循环。默认值为 100;最大值为 1000。

垃圾收集器步长 控制每个增量步骤的大小,具体来说就是解释器在执行每个步骤之前分配的字节数。此参数是对数的:值为 n 表示解释器将在每个步骤之间分配 个 字节,并在该步骤中执行等效的工作。较大的值(例如 60)会使收集器成为 Stop-the-world(非增量)收集器。默认值为 13,表示步长约为 8 KB。

#分代模式

在分代模式下,收集器会频繁执行小回收,仅遍历最近创建的对象。如果小回收后内存使用量仍然超出限制,收集器会执行一次“stop-the-world”大回收,遍历所有对象。分代模式使用两个参数:次要乘数主要乘数

次要乘数 控制次要回收的频率。如果次要乘数为 x ,则当内存使用量比上一次主要回收后增加 时,将执行新的次要回收。例如,如果倍数为 20,则当内存使用量比上一次主要回收后增加 时,收集器将执行一次次要回收。默认值为 20;最大值为 200。

主要乘数 控制主要回收的频率。如果主要乘数为 x ,则当内存使用量比上一次主回收后增加 时,将执行一次新的主要回收。例如,如果倍数为 100,则当内存使用量比上一次回收后增加两倍时,垃圾收集器将执行一次主回收。默认值为 100;最大值为 1000。

#推荐阅读

collectgarbage - Lua 5.4 Reference Manual

创建于 2025/10/3

更新于 2025/10/3