[Lua]Lua内存泄露检测原理

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中支持垃圾回收机制的对象有五种:stringtablefunctionfull userdatathread而他们的引用直接或间接的保存到lua_state对象,_G全局表,Registry注册表,global_state->mt中。

在脚本中:

  • 运行的lua脚本本身就是lua_state
  • _G就是_G全局表
  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值