lua垃圾回收机制

lua垃圾回收机制,第1张

概述http://www.cnblogs.com/yyxt/p/4223639.html  一、检测lua内存泄漏: 注:使用“collectgarbage("collect")”,局部变量v被回收,my_list没有被回收。 注:局部变量v占用的内存被回收。 注:将my_list置为nil,使用“collectgarbage("collect")”可以回收。 总结一: 如何监测Lua的编程产生内存泄

http://www.cnblogs.com/yyxt/p/4223639.HTML 

一、检测lua内存泄漏:

注:使用“collectgarbage("collect")”,局部变量v被回收,my_List没有被回收。

@H_419_22@

注:局部变量v占用的内存被回收。

注:将my_List置为nil,使用“collectgarbage("collect")”可以回收。

总结一: 如何监测Lua的编程产生内存泄露:

1.       针对会产生泄露的函数,先调用collectgarbage("count"),取得最初的内存使用

2.       函数调用后,collectgarbage("collect")进行收集,并使用collectgarbage("count")再取得当前内存,最后记录两次的使用差

3.       从test1的收集可看到,collectgarbage("collect")被调用,并不保证一次成功,所以,大可以调用多次

总结二: 如何避免Lua应用中出现的内存使用过大行为:

1.       当然是代码实现不出现泄露

2.       在测试中,其实还发现,Lua中被分配的内存,其实并不会自动回收(个人估计要么就是Lua虚拟机没有做这个事情,要么就是回收的时机是在C层),为了避免内存过大,应用的运行时,可能需要定期的(调用collectgarbage("collect"),又或者collectgarbage("step"))进行显式回收。

 ----------------------------------------------------------------------------------

【使用LUA开发游戏,发现内存耗费成倍增长】http://blog.sina.com.cn/s/blog_a17b071c0101itua.HTML

内存随着时间成倍增加,这个感觉应该是和堆栈分配有关系,但是看我们LUA框架代码,大部分用到LUA地方都有进行释放了呀。。。

挨个对照COCOS2D-X提供的LUA框架和我们的LUA框架,发现在一般的方法,比如执行字符串,执行文件,等等ExecuteString,ExecuteScriptfile,ExecuteGlobalFunction函数写法都一样,于是范围缩小到我们自己写的几个函数里面。我们自己封装的执行对话框内部函数ExecutetableFunction,GettableFuntion等几个,仔细阅读代码后,终于发现问题了:

1)堆栈用完没有及时恢复

2)没有及时使用垃圾回收
 解决方案

1)在函数异常返回或者正常处理返回时,堆栈要进行恢复:

lua_pop(L,1);

// 恢复之前的栈顶位置

lua_settop(L,0);

2)在调用lua_pcall()时,要调用lua_gc(L,LUA_GCColLECT,0);进行垃圾回收;

在这些修改后,重新进行编译运行,这个时候再打印内存,发现就很OK了:

总结

以上是内存溢出为你收集整理的lua垃圾回收机制全部内容,希望文章能够帮你解决lua垃圾回收机制所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1243713.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存