我们游戏开始都是用c++写的,后来写了一半的时候加入了lua,现在有4个模块用lua写的逻辑,类对象都是在模拟器里面创建好,基于tolua将对象和相关方法导入到lua中,然后用lua实现逻辑部分。功能实现之后,昨天开始看看lua逻辑部分有没有内存泄漏,网上查了很多资料,边学习边查找。
luaMonitor这个工具还不错,可以看到lua使用的内存变化以及分配内存的变量和函数等,通过这个我看到我们代码确实有泄露。 仔细阅读代码发现了几个局部变量没有写local确实会造成泄露,但是不停的进出一个功能模块,发现内存会持续增加。说明问题就不只是这么简单了。
网上学习了lua的内存垃圾回收机制,大概是这样的:
名为标志和清扫(Mark-and-Sweep)的方式。
基础的Mark-and-Sweep算法是最古老的解决循环引用情况垃圾收集算法之一。
顾名思义,这是一个two phases的算法,可用很简单的文字描述:
(1)Mark phase(标志阶段)
1> 每个可被gc的对象都拥有一个标志位,初始为0(unmarked)。
2> 定义程序中第一层可访问的对象集合为 根对象集合(root set)。
3> 递归遍历根集合中所有对象的引用关系,如果某对象标志位为unmarked,
则标志为1(marked)。