Lua(垃圾回收)
Lua垃圾回收机制概述
Lua采用自动垃圾回收机制(Garbage Collection, GC),主要基于标记-清除(Mark-and-Sweep)算法实现。Lua管理的内存包括字符串、表、函数、线程、用户数据等对象,通过引用计数和周期性扫描来释放不再使用的内存。
垃圾回收的基本原理
Lua的GC分为两个阶段:标记阶段和清除阶段。标记阶段会遍历所有活跃对象,标记仍在使用的对象;清除阶段会释放未被标记的对象。Lua的GC是增量式的,允许分步执行以减少对程序运行的干扰。
控制垃圾回收的参数
Lua提供以下参数控制GC行为:
- pause:控制GC频率,默认值200(百分比)。值越小GC越频繁。
- stepmul:控制GC步进速度,默认值200。值越大单步回收量越多。
- stepsize:控制单步扫描的内存大小,默认值1024(字节)。
手动触发垃圾回收
通过collectgarbage
函数可手动控制GC:
collectgarbage("collect") -- 执行一次完整的GC循环
collectgarbage("stop") -- 暂停GC
collectgarbage("restart") -- 重启GC
collectgarbage("count") -- 返回当前内存使用量(KB)
弱表与垃圾回收
弱表(weak table)是一种特殊的表,其键或值不会阻止GC回收对象。通过元表设置__mode
字段实现:
local weak_table = setmetatable({}, {__mode = "k"}) -- 弱键表
local weak_values = setmetatable({}, {__mode = "v"}) -- 弱值表
优化垃圾回收性能
减少GC压力的常见方法:
- 避免频繁创建临时表或闭包,复用对象。
- 使用对象池管理频繁创建销毁的对象。
- 对大内存操作后手动调用
collectgarbage
。
监控内存使用
通过collectgarbage("count")
可获取当前内存占用量(KB):
print(collectgarbage("count")) -- 输出当前内存使用量
垃圾回收的注意事项
- 循环引用需通过弱表或手动解除引用避免内存泄漏。
- 避免在关键性能路径中频繁触发GC。
- Lua 5.1与5.2+的GC实现有差异,需注意版本兼容性。