Lua 垃圾回收器函数

学习目标:

--垃圾回收器函数
--[[

   Error错误  Debug调试  GC回收

   垃圾回收器函数
   Lua 提供了以下函数collectgarbage ([opt (, arg)])用来控制自动内存管理:

   collectgarbage("collect"): 做一次完整的垃圾收集循环。通过参数 opt 它提供了一组不同的功能:

   collectgarbage("count"): 以 K 字节数为单位返回 Lua 使用的总内存数。 这个值有小数部分,所以只需要乘上 1024 就能得到 Lua 使用的准确字节数(除非溢出)。

   collectgarbage("restart"): 重启垃圾收集器的自动运行。

   collectgarbage("setpause"): 将 arg 设为收集器的 间歇率 (参见 §2.5)。 返回 间歇率 的前一个值。

   collectgarbage("setstepmul"): 返回 步进倍率 的前一个值。

   collectgarbage("step"): 单步运行垃圾收集器。 步长"大小"由 arg 控制。 传入 0 时,收集器步进(不可分割的)一步。 传入非 0 值, 收集器收集相当于 Lua 分配这些多(K 字节)内存的工作。 如果收集器结束一个循环将返回 true 。

   collectgarbage("stop"): 停止垃圾收集器的运行。 在调用重启前,收集器只会因显式的调用运行。
--]]

mytable = {"apple", "orange", "banana", "a", "b", "c", "1", "2", "3"}
--返回当前程序所占内存
print(collectgarbage("count"))  --输出 21.0966796875

mytable = nil
print(collectgarbage("count"))  --输出 21.1259765625

collectgarbage("collect")
print(collectgarbage("count"))  --输出 19.4677734375

### Lua 中基于 `collectgarbage("step")` 的定时垃圾回收 在 Lua 中,可以通过调用函数 `collectgarbage("step", arg)` 来执行增量式的垃圾回收操作。参数 `arg` 表示每次步进所花费的时间比例,单位为秒的一部分[^1]。具体来说: - 调用 `collectgarbage("step", n)` 会尝试运行一次垃圾回收步骤,其中 `n` 是一个数值,表示本次垃圾回收的持续时间相对于总目标时间的比例。 - 如果返回值为 `true`,则说明此次步进完成了整个垃圾回收周期;如果返回值为 `false`,则意味着还需要更多的步进来完成当前的垃圾回收。 为了实现定时触发垃圾回收的功能,可以结合循环结构以及延迟机制来定期调用 `collectgarbage("step")` 方法。下面是一个简单的例子展示如何设置每秒钟进行一定次数的垃圾回收步进操作: ```lua -- 定义一个函数用于逐步清理垃圾并控制频率 function timedGarbageCollection(interval, stepsPerInterval) local startTime = os.clock() -- 获取起始时间戳 while true do local currentTime = os.clock() -- 计算自上次迭代以来经过了多少秒 if (currentTime - startTime >= interval) then for i = 1, stepsPerInterval do collectgarbage("step", 0.1) -- 进行单次短时垃圾回收 end startTime = currentTime -- 更新计时起点 end coroutine.yield() -- 使用协程让出CPU资源给其他任务 end end -- 启动一个独立线程来进行垃圾管理 local gcThread = coroutine.create(timedGarbageCollection) coroutine.resume(gcThread, 1, 5) -- 设置每隔一秒做五次小规模GC处理 print("Main program continues running...") for i=1,1e6 do end -- 主程序继续工作... ``` 上述代码片段创建了一个名为 `timedGarbageCollection` 的函数,它接受两个参数:间隔时间和每个间隔内的步数。此函数会在指定时间内多次调用 `collectgarbage("step")` 并利用协程确保不影响主线程的工作流程[^2]。 另外需要注意的是,在调整垃圾回收行为之前可能需要重新配置其性能参数比如暂停时间和乘法因子等,默认情况下这些值分别为 200 和 400 ,即允许 GC 占用最多 CPU 时间的一半,并且当已分配内存达到现有总量四倍时才启动新的收集过程[^3]。因此可以根据实际需求修改它们以便更好地配合手动调度策略: ```lua collectgarbage("setpause", 100) -- 减少停顿时间至最低限度 collectgarbage("setstepmul", 5000)-- 加快回收速度到正常水平五十倍以上 ``` 通过这种方式能够灵活定制适合特定应用场景下的自动或半自动化内存维护方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值