Lua表格内存泄漏?

6

我遇到了一个关于lua表使用的内存泄漏问题,以下是代码:

function workerProc()
    -- a table holds some objects (userdata, the __gc is implememted correctly)
    local objs = {createObj(), createObj(), ...}
    while isWorking() do
        -- ...
        local query = {unpack(objs)}
        repeat
            -- ...
            table.remove(query, queryIndex)
        until #query == 0
        sleep(1000)
    end
end

表格objs是用一些用户数据对象初始化的,并且这些对象在while循环中始终可用,因此不会对这些objs执行垃圾回收。在while循环中,query表格使用unpack函数从objs中初始化所有元素。当运行脚本时,我发现内存不断增加,但是当我注释掉local query = {unpack(objs)}后,内存消失了。
我认为这段代码没有内存泄漏问题,因为query变量是局部变量,在每次while循环迭代之后应该无法访问,但事实并非如此。有人知道为什么内存被该表所吞噬吗?
1个回答

7
根据您的代码示例,您看到的可能解释是,在循环内部垃圾回收机制(gc)没有机会执行完整的收集周期。
您可以在内部循环后立即使用`collectgarbage()`来强制进行一次垃圾回收并查看是否解决了内存问题。
while isWorking() do
    -- ..
    local query = {unpack(objs)}
    repeat
        -- ..
        table.remove(query, queryIndex)
    until #query == 0
    collectgarbage()
    sleep(1000)
end

另一个可能性是将本地查询移出循环,并在外部循环中创建一次表,而不是在每次迭代中创建新表。

1
谢谢!我认为更好的方法是将查询表移出内部循环。 - Kery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接