Lua表内存泄漏?

我有一个关于使用lua table的内存泄漏问题,代码如下:

function workerProc()
    --一个包含某些对象(userdata,__gc已正确实现)的表格
    local objs = {createObj(), createObj(), ...}
    while isWorking() do
        -- ...
        local query = {unpack(objs)}
        repeat
            -- ...
            table.remove(query, queryIndex)
        until #query == 0
        sleep(1000)
    end
end

objs用一些userdata对象初始化,并且这些对象在while循环中始终可用,因此在这些objs上不会执行垃圾回收。在while循环中,query表格使用unpack函数从objs中初始化了所有元素。运行脚本时,我发现内存保持增长,但当我注释掉local query = {unpack(objs)}时,它消失了。

我不认为这段代码有内存泄漏问题,因为query变量是局部的,在每个while循环迭代后应该无法使用,但事实是这样的。有人知道为什么这个表格会占用内存吗?

点赞
用户234175
用户234175

根据您示例的代码,您看到的可能是gc没有机会在循环内执行完整的收集周期的解释。

您可以在内部循环之后使用collectgarbage()强制进行收集,看看是否解决了内存问题:

while isWorking() do
    -- ..
    local query = {unpack(objs)}
    repeat
        -- ..
        table.remove(query, queryIndex)
    until #query == 0
    collectgarbage()
    sleep(1000)
end

另一种可能性是将local query移动到循环外部,并仅在第一次创建表,而不是在每次外部循环中都创建一个新表。

2013-11-22 08:34:19