Lua 在用户数据对象中添加 lua table 时内存泄漏
Lua memory leak when add lua table in userdata object
当我按下 'btn' 内存从 80M 上升到 240M。
我按下 'btn2' 删除对象(self.sprite)包括许多 lua table,但内存没有下降。
这段代码有什么问题?还是 lua 错误?
我用的是cocos2dx-3.8.1/xcode7/ios模拟器
local MainScene = class("MainScene", cc.load("mvc").ViewBase)
function MainScene:onCreate()
local btn = ccui.Button:create("res/Button_Normal.png","res/Button_Press.png","res/Button_Disable.png")
btn:setScale9Enabled(true)
btn:setContentSize(cc.size(70,70))
btn:setPosition(100,100)
btn:setTitleColor(cc.c3b(0,0,0))
btn:setTitleFontSize(30)
btn:setTitleText("Add")
btn:addTouchEventListener(function(ref,typ)
if typ == ccui.TouchEventType.ended then
self.sprite = cc.Sprite:create("res/Button_Normal.png")
for i=1,1000000 do
self.sprite["s_"..i] = {"abc",123}
end
self.sprite:setPosition(100, 200)
self:addChild(self.sprite)
end
end)
self:addChild(btn)
local btn2 = ccui.Button:create("res/Button_Normal.png","res/Button_Press.png","res/Button_Disable.png")
btn2:setScale9Enabled(true)
btn2:setContentSize(cc.size(70,70))
btn2:setPosition(200,100)
btn2:setTitleColor(cc.c3b(0,0,0))
btn2:setTitleFontSize(30)
btn2:setTitleText("remove")
btn2:addTouchEventListener(function(ref,typ)
if typ == ccui.TouchEventType.ended then
if self.sprite then
self.sprite:removeFromParent(true)
self.sprite = nil
end
end
end)
self:addChild(btn2)
end
return MainScene
可能不是内存泄漏。您可以使用 Lua 垃圾回收方法来查看 Lua 分配给这些结构的内存量。例如,尝试以下操作:
collectgarbage("count") -- #1 returns something like 2574.62890625 (in Kb)
-- allocate and release memory
collectgarbage() -- collect memory
collectgarbage()
collectgarbage("count") -- #2 check the amount of memory
您应该看到在 1 和 2 中使用的内存量大致相同(假设分配的所有内容都已释放,因为它没有任何引用),但通常您不应期望报告的内存操作系统由于碎片化而下降到原来的数量。您应该期望 Lua 继续重用它释放的内存,因此如果您再次分配相同的结构,内存总量将保持大致相同。
我怀疑 Lua 中存在内存泄漏,除非您可以在不涉及 cocos2dx 的更简单的脚本上进行演示 API.
当我按下 'btn' 内存从 80M 上升到 240M。 我按下 'btn2' 删除对象(self.sprite)包括许多 lua table,但内存没有下降。
这段代码有什么问题?还是 lua 错误?
我用的是cocos2dx-3.8.1/xcode7/ios模拟器
local MainScene = class("MainScene", cc.load("mvc").ViewBase)
function MainScene:onCreate()
local btn = ccui.Button:create("res/Button_Normal.png","res/Button_Press.png","res/Button_Disable.png")
btn:setScale9Enabled(true)
btn:setContentSize(cc.size(70,70))
btn:setPosition(100,100)
btn:setTitleColor(cc.c3b(0,0,0))
btn:setTitleFontSize(30)
btn:setTitleText("Add")
btn:addTouchEventListener(function(ref,typ)
if typ == ccui.TouchEventType.ended then
self.sprite = cc.Sprite:create("res/Button_Normal.png")
for i=1,1000000 do
self.sprite["s_"..i] = {"abc",123}
end
self.sprite:setPosition(100, 200)
self:addChild(self.sprite)
end
end)
self:addChild(btn)
local btn2 = ccui.Button:create("res/Button_Normal.png","res/Button_Press.png","res/Button_Disable.png")
btn2:setScale9Enabled(true)
btn2:setContentSize(cc.size(70,70))
btn2:setPosition(200,100)
btn2:setTitleColor(cc.c3b(0,0,0))
btn2:setTitleFontSize(30)
btn2:setTitleText("remove")
btn2:addTouchEventListener(function(ref,typ)
if typ == ccui.TouchEventType.ended then
if self.sprite then
self.sprite:removeFromParent(true)
self.sprite = nil
end
end
end)
self:addChild(btn2)
end
return MainScene
可能不是内存泄漏。您可以使用 Lua 垃圾回收方法来查看 Lua 分配给这些结构的内存量。例如,尝试以下操作:
collectgarbage("count") -- #1 returns something like 2574.62890625 (in Kb)
-- allocate and release memory
collectgarbage() -- collect memory
collectgarbage()
collectgarbage("count") -- #2 check the amount of memory
您应该看到在 1 和 2 中使用的内存量大致相同(假设分配的所有内容都已释放,因为它没有任何引用),但通常您不应期望报告的内存操作系统由于碎片化而下降到原来的数量。您应该期望 Lua 继续重用它释放的内存,因此如果您再次分配相同的结构,内存总量将保持大致相同。
我怀疑 Lua 中存在内存泄漏,除非您可以在不涉及 cocos2dx 的更简单的脚本上进行演示 API.