Lua内存泄露
首先第一点,lua中的内存泄露和我们所说的c/c++中的内存泄露本质上是不一样的。
lua中有垃圾回收机制(GC),所以理论上是不会有内存泄露的。当它进行GC的时候,会从根部开始扫描所有的对象,如果某个地方对这个对象还有引用,就不会把这个对象内存collect,这个对象就没有被GC。所以lua中的内存泄露是指那些:已经没有被使用了,但外部依然还有引用存在的对象。
--函数中应该被申明为local的对象忘记加local
local function test()
testTable = {} --这个testTabel会被存放在全局表_G中,GC时由于此对象还有引用存在,所以这里总是会有一个table泄露。
local mt = {} --mt加了local修饰,函数调用完后,引用也不复存在了,GC时会被回收。
setmetatable(testTable, mt)
end
检测原理
lua中支持垃圾回收机制的对象有五种:string,table,function,full userdata,thread。而他们的引用直接或间接的保存到:lua_state对象,_G全局表,Registry注册表,global_state->mt中。
在脚本中:
- 运行的lua脚本本身就是lua_state。
- _G就是_G全局表