0Pricing
Lua Academy · 课时

Lua 垃圾回收基础

了解 Lua 增量式 GC 的工作方式:标记清除、阈值和 collectgarbage()。

Lua 垃圾回收基础 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。

什么是垃圾回收?

Lua 使用自动垃圾回收器,回收不再能从任何根对象访问到的对象(表、字符串和闭包)所占用的内存。

标记清除算法

Lua 的垃圾回收器使用增量式标记清除算法。它从根对象开始标记所有可访问对象,然后清除(释放)未标记的对象。

增量式回收

垃圾回收器会在程序运行期间分成小段执行。这样可以避免长时间暂停。每次增量执行的工作量由 垃圾回收步骤参数控制。

collectgarbage 函数

collectgarbage(opt, arg) 可直接控制垃圾回收器。

collectgarbage("collect")      -- run a full GC cycle
collectgarbage("stop")         -- stop automatic GC
collectgarbage("restart")      -- restart automatic GC
print(collectgarbage("count")) -- KB of memory in use

垃圾回收参数

collectgarbage("setpause", n) 设置垃圾回收周期之间的暂停比例(200 = 下一个周期前允许内存翻倍)。"setstepmul" 控制垃圾回收速度。

collectgarbage("setpause", 200)    -- default
collectgarbage("setstepmul", 200)  -- default

弱引用与垃圾回收

通常,引用会使对象保持存活。弱引用不会这样做——即使弱表指向某个对象,垃圾回收器仍然可以回收该对象。

分代式垃圾回收(Lua 5.4)

Lua 5.4 引入了可选的分代式垃圾回收模式。年轻对象会被频繁回收,老对象的回收频率较低。使用 collectgarbage("generational") 进行切换。

内存压力触发条件

当内存使用量超过阈值(由暂停参数设置)时,垃圾回收器会自动运行。分配大量临时表会增加垃圾回收压力,并可能降低程序速度。

降低垃圾回收压力

  • 重复使用表,而不是分配新表。
  • 避免在高频循环中创建大量短生命周期的闭包。
  • 预先分配已知大小的数组。

字符串驻留

Lua 会驻留所有字符串——相同的字符串共享同一个对象。这意味着字符串创建的哈希操作复杂度为 O(n),但比较复杂度为 O(1)。短字符串的开销非常低。

终结器(__gc)

表可以拥有一个由垃圾回收器在对象释放前调用的 __gc 元方法。这对于释放文件句柄或 C 指针等外部资源很有用。

垃圾回收问题

collectgarbage("count") 会返回什么?

回顾:Lua 垃圾回收基础

Lua 的增量式标记清除垃圾回收器会自动回收无法访问的内存。使用 collectgarbage 监控和控制回收。通过重复使用表并避免在高频路径中进行过多分配来降低压力。

常见问题解答

「Lua 垃圾回收基础」课时是免费的吗?

是的 — 「Lua 垃圾回收基础」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。

「Lua 垃圾回收基础」这节课中我会学到什么?

了解 Lua 增量式 GC 的工作方式:标记清除、阈值和 collectgarbage()。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Lua Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「Lua 垃圾回收基础」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Lua Academy 课中编写并运行代码吗?

能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Lua 垃圾回收基础
  2. 弱键和弱值
  3. 使用 __gc 执行终结操作
  4. 避免内存泄漏
← 返回 Lua Academy