我有关于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
使用一些userdata对象初始化表objs
,并且这些对象在while循环中始终可用,因此不会对这些obj执行gc。在while循环中,使用query
中的所有元素初始化objs
表(使用解包函数)。在运行脚本时,我发现内存不断增加,但当我注释掉local query = {unpack(objs)}
时,它就会消失。
我不认为这段代码有内存泄漏问题导致query
var是本地的,并且在每次迭代while循环后它应该是不可用的,但事实是。有谁知道为什么内存会被那个表吞噬?
答案 0 :(得分:7)
从您的代码示例来看,您所看到的可能的解释可能是gc在循环内部没有机会执行完整的收集循环。
您可以使用collectgarbage()
在内循环后立即强制收集,看看是否能解决内存问题:
while isWorking() do
-- ..
local query = {unpack(objs)}
repeat
-- ..
table.remove(query, queryIndex)
until #query == 0
collectgarbage()
sleep(1000)
end
另一种可能性是将local query
移出循环并创建表一次,而不是在outter循环中的每次迭代中创建一个新表。