执行 Lua 垃圾收集会导致 C 栈溢出

我正在微控制器环境中运行Lua,使用RTOS。 可用资源非常有限(仅有几KB的RAM),我正在尝试确保Lua在此环境中正常工作。

为了压力测试整个固件并确保正确处理内存,我加载了一个脚本,基本上执行以下操作:

index = 1
data = {}

--该函数会重复调用,直到记忆耗尽。
function test()
    data[index] = 5
    data[index + 1] = 6
    data[index + 2] = 7
    index = index + 3
end

我期望这个功能会使Lua耗尽内存(由于连续分配而导致的内存)。

让我惊讶的是,程序以另一种方式失败了。 随着内存使用量的增加,Lua调用垃圾回收器来释放一些内存。每次垃圾收集器运行时,它都会使用越来越多的堆栈,导致栈溢出远在堆究竟被耗尽之前。无论我增加多少堆栈大小,垃圾回收器都很快就把它全部吃完了。

请注意,我在这里讨论的是C运行时堆栈,即CPU在硬件上访问的实际内存,而不是Lua API堆栈.

这是预期的行为吗?我期望垃圾收集器有具体的工作要做,它应该每次执行消耗相同的内存。

有什么办法处理垃圾回收以改善这种情况吗?

点赞