最近由于项目原因,我开始研究lua的回收机制,内存泄漏以及内存优化,于是在网上开始搜寻资料。
http://www.huomo.cn/developer/article-e8c5.html这篇文章讲述了游戏过程中遇到一些内存泄漏的问题,其中最容易犯的一个问题就是将局部变量声明为一个全局的变量,这样做的话,即使使用了collectgarbage("collect")内存依然不会被回收,里面还谈到了在写游戏逻辑的时候,需要注意到的四个点,其中第二点,我曾今为了找这个问题找了一早上来查一个崩溃bug,原因就是在c++中删除了lua中的某个怪物,而并没有通知lua,所以在写游戏逻辑的时候务必保证c++,lua中的对象删除,添加要一致,lua调用c++的一个create接口,一定要记得不用的时候remove这个对象,否则会造成内存泄漏。
http://stackoverflow.com/questions/4064451/luas-gc-and-realtime-game这个是stackoverflow 上面关于lua gc的一个问题,介绍了lua手动gc的方法。
http://lua-users.org/lists/lua-l/2005-09/msg00603.html和http://lua-users.org/lists/lua-l/2005-09/msg00604.html介绍了如何按照lua gc step方式进行垃圾回收。
http://lua-users.org/lists/lua-l/2008-07/msg00041.html讨论了手动回收内存的方式,以及遇到的一些问题的解释。
如果一个变量不用的话,记得将其置为nil,相关测试代码如下:
print(collectgarbage("count"))
local tableTest = {}
for i=1,300 do
tableTest[#tableTest + 1] = i
end
print(collectgarbage("count"))
print(collectgarbage("collect"))
print(collectgarbage("count"))
tableTest = nil --内存清除
print(collectgarbage("collect"))
print(collectgarbage("count"))
运行结果如下:
20.3701171875
28.4306640625
0
27.39453125
0
19.36328125
如此看来,不用的内存一定要置为nil啊
尝试这样内存回收
collectgarbage("setpause",100)
collectgarbage("setstepmul",2000)
collectgarbage("stop")
print(collectgarbage("count"))
local tableTest = {}
for i=1,300 do
tableTest[#tableTest + 1] = i
end
print(collectgarbage("count"))
-- print(collectgarbage("collect"))
tableTest = nil --内存清除
collectgarbage("step",1)
print(collectgarbage("count"))