有关lua内存泄露的尝试 - pxqwxl/myLearnPoject GitHub Wiki
最近在项目中遇到了串资源的问题 主要原因就是全局变量的释放require的缓存 所以我做了如下尝试
collectgarbage("collect")
print(collectgarbage("count"), "count00")
require("app.views.mainSceneManager")
collectgarbage("collect")
print(collectgarbage("count"), "count1")
local instance3 = mainSceneManager:getInstance()
print(instance3.aaa, "aaaaaaaaaaaa====55555")
instance3.aaa = 3
print(collectgarbage("count"), "count2")
instance3 = nil
print(collectgarbage("count"), "count3")
collectgarbage("collect")
print(collectgarbage("count"), "count5")
package.loaded["app.views.mainSceneManager"] = nil
collectgarbage("collect")
print(collectgarbage("count"), "count7")
mainSceneManager = nil
collectgarbage("collect")
print(collectgarbage("count"), "count9")
当执行这段代码时输出如下 看输出的样子可以总结出对instance3进行释放并没有释放掉过多资源 当你packegload所require的文件时 也没有释放掉任何资源 也只是释放出了require中的缓存 真正的manager这个全局表还是存在的 但是当你mainSceneManager 置nil时 这时的资源比之前加载之前还要小了 所以可以得出结论 释放时要将相应的manager也置为空
- [LUA-print] 1927.36328125 count00
- [LUA-print] 1927.923828125 count1
- [LUA-print] getInstance
- [LUA-print] 0 aaaaaaaaaaaa====55555
- [LUA-print] 1928.0966796875 count2
- [LUA-print] 1928.1279296875 count3
- [LUA-print] 1928.048828125 count5
- [LUA-print] 1928.048828125 count7
- [LUA-print] 1927.275390625 count9
当把 package.loaded["app.views.mainSceneManager"]这段代码注释掉 结果如下:
- [LUA-print] 1927.3359375 count00
- [LUA-print] 1927.896484375 count1
- [LUA-print] getInstance
- [LUA-print] 0 aaaaaaaaaaaa====55555
- [LUA-print] 1928.0693359375 count2
- [LUA-print] 1928.1005859375 count3
- [LUA-print] 1928.021484375 count5
- [LUA-print] 1928.021484375 count7
- [LUA-print] 1928.021484375 count9
这时你会发现manager置为空并没有减少内存 所以可以得出结论 当你require还存在时 manager = nil仅仅是将这个变量设置为空了 所以当你需要把require的全局变量释放掉时不光要packegload还要 讲相应的manager设置为nil缺一不可由于第一次尝试存在有疑问(为何释放完反而比之前的小了)因此我又做了如下尝试 放开注释把这段代码放到main.lua里 屏蔽掉除搜索路径以外所有代码结果如下:
- [LUA-print] 1505.5166015625 count00
- [LUA-print] 1506.2001953125 count1
- [LUA-print] getInstance
- [LUA-print] 0 aaaaaaaaaaaa====55555
- [LUA-print] 1506.3740234375 count2
- [LUA-print] 1506.4052734375 count3
- [LUA-print] 1506.3251953125 count5
- [LUA-print] 1506.3251953125 count7
- [LUA-print] 1505.5517578125 count9
这时的资源内存虽然释放完了但还是比之前的大 与第一个实验结果冲突 由于个人了解的知识有限所以我暂时认为 是可能还有其他操作导致的内存的变化** 但是可以肯定的是释放manager中每一步操作 我们的内存都有减少 所以说这些操作是有意义的因此我得出结论当你单独讲变量设置为nil并不会影响到这个全局表在内存中的占用 但是当你讲全局表进行释放 由于你还有变量在引用因此 这个全局表也不会被释放掉 所以要释放掉一个require过的全局表需要有两步操作 1是packegload 2将该表设置为nil**