Lua游戏内存泄漏检查

来源:互联网 发布:比特精灵 for mac 编辑:程序博客网 时间:2024/05/20 03:44

上一篇我们对Lua对象释放做了一些初步了解,那么在这一节中,我就简单介绍两种Lua内存泄漏检查的常用方法。


  1. 内存快照

    对于内存快照,目前用得最多的是云风大大开源在github上的snapshot库。原文链接

    它提供一个函数,可以对当前的 Lua State 做一个完整的快照,为了减少分析数据,只记录了复杂对象的引用关系。也就是记录记录下所有 table thread userdata function 间的引用。

    我们可以在不同时间,对 Lua State 拍两个快照,相比较后,就很容易知道新增加的内存处于何处。

  2. _G表遍历

    方案一、从_G开始遍历整个Lua节点,包括table,metatable,和函数的upvalue的引用的统计个数,在引用计数找出异常的节点。

    方案二、从_G开始遍历整个Lua节点,记录整个节点树,在不同时间比较检查新增的节点。

    当然,_G表遍历也存在不少坑,例如单例,引用变量等都可能引起死循环,这个得注意。


在排查过程中,我们也应该懂得过滤一些干扰项。比如下面几种类型是引用类型,并不是值类型,所以往往赋值操作后,内存快照也会把这些匹配出来。

Tables、functins、threads、userdata。对于这几种值类型,其变量皆为引用类型(变量本身不存储类型数据,而是指向它们)。赋值、参数传递、函数返回等都操作的是这些值的引用,并不产生任何copy行为。

0 0
原创粉丝点击