近几天发现公司项目(cocos2dx arpg手游)战斗这块出现了内存泄漏,lua层和C++层都有泄漏,挂几分钟lua内存额外增加了50M,打算优先从lua入手去查询,因为针对C++层,我相信目前使用的底层代码是比较稳定的,不会出现严重的泄漏现象,并且我有使用打印渲染树的方式检测过,不存在创建大量的节点并忘记手动remove的情况(这个是用于检测是否有节点创建后忘记释放导致内存泄漏的工具,是本人原创,在后面文章里面会分享),所以优先查lua这块的泄漏是比较合适的方法。
本来打算用云风弄的一个检测lua内存泄漏的工具,但是发现好像解决不了问题,貌似那个工具的原理是取一段代码执行前后的内存snapshot进行比对,但是期间大量的变量创建及销毁,好像不太容易比对。刚好又看到一篇不错的文章,使用了弱引用的方式去检测。原理是:对一个lua对象进行引用,然后干掉该对象,只要还有一份引用存在,该对象就无法被干掉,也就是会泄漏;但是如果对一个lua对象进行弱引用,同样可以获得该对象的数据,并且当对象被干掉的时候,引用也会被干掉。用这个原理可以建立一份全局的弱引用表,通过引用对象的方式判断某个对象是否被释放干净。个人觉得这个方法应该会比较合适。
PS:感谢文章作者寰子,并提供传送门:
http://blog.csdn.net/xocoder/article/details/42685685
原文链接:/cocos2dx/339180.html