我遇到了关于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/