Lua表内存泄漏?

Posted

技术标签:

【中文标题】Lua表内存泄漏?【英文标题】:Lua table memory leak? 【发布时间】: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 是本地的,在每次循环迭代后它应该不可用,但事实是。有人知道为什么内存会被那张桌子吞掉吗?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

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

以上是关于Lua表内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

为啥lua语言中使用全局变量就会造成内存泄漏

Lua内存泄漏应对方法[转]

lua内存泄漏检测工具原理及设计

链表切割的内存泄漏

iTextSharp - 非常大的表内存泄漏

使用临时表调用 postgres 函数的节点导致“内存泄漏”