memory - Lua表内存泄漏?

标签 memory memory-leaks lua lua-table

我遇到了关于lua table的使用的内存泄漏问题,代码如下:

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

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

最佳答案

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

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

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

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

关于memory - Lua表内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20139359/

相关文章:

ios - MKAnnotationView:内存泄漏

ios - UIGraphicsGetImageFromCurrentImageContext() - 内存泄漏

c++ - 为什么我在这里泄漏内存(深度优先搜索)C++?

iOS 低内存警告和模拟器的 "Simulate memory warning"

c++ - 如何追踪 COM 内存泄漏

mysql - 如何使用 MySql-Proxy 跟踪 MySql 查询?

events - 5秒内按任意键

arrays - Lua中将字符串转换为变量名

c - 内存分配的差异

c# - 将结构从 C# 程序共享到 C++ win32 DLL 的最佳实践?