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表内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章