【问题标题】:Lua table memory leak?Lua表内存泄漏?
【发布时间】:2013-11-22 07:27:11
【问题描述】:

我有一个关于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 循环中始终可用,因此不会对这些对象执行gc。在 while 循环中,query 表使用来自objs 的所有元素进行初始化(使用解包函数)。在运行脚本时,我发现内存一直在增加,但是当我注释掉 local query = {unpack(objs)} 时,它就消失了。

我不认为这段代码有内存泄漏问题,因为query var 是本地的,在每次循环迭代后它应该不可用,但事实是。有人知道为什么内存会被那张桌子吞掉吗?

【问题讨论】:

    标签: memory memory-leaks lua lua-table


    【解决方案1】:

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

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

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

    另一种可能性是将local query 移出循环并创建一次表,而不是在外循环中的每次迭代时都创建一个新表。

    【讨论】:

    • 谢谢!我认为更好的方法是将查询表移出内部循环。
    猜你喜欢
    • 1970-01-01
    • 2016-01-26
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多