lua垃圾回收机制
来源:互联网 发布:新申请域名无法访问 编辑:程序博客网 时间:2024/05/16 16:21
一、检测lua内存泄漏:
注:使用“collectgarbage("collect")”,局部变量v被回收,my_list没有被回收。
注:局部变量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了:
原文地址:http://www.cnblogs.com/yyxt/p/4223639.html
- lua垃圾回收机制
- lua垃圾回收机制
- lua垃圾回收机制
- lua垃圾回收机制
- lua垃圾回收机制
- lua的垃圾回收机制
- Lua中的垃圾回收机制
- Lua垃圾回收
- Lua 垃圾回收
- lua 语法-垃圾回收
- 垃圾回收机制--回收周期
- 垃圾回收机制
- 垃圾回收机制
- 垃圾回收机制
- .net 垃圾回收机制
- flex 垃圾回收机制
- 垃圾回收机制
- java垃圾回收机制
- 深入浅出JMS(一)——JMS简介
- C++ Primer 学习笔记_31_STL实践与分析(5) --再谈string类型(上)
- Spring mvc view层循环展示controller层发送的集合对象
- JavaScript typeOf()
- poj 2828
- lua垃圾回收机制
- TCP/IP、Http的区别
- 对PES NALU 帧的疑惑
- Hibernate基础配置
- 分离线程
- linux下mysql 自动备份
- 在oracle数据库中如果查询一个数据库中有哪几张表?
- ubuntu14.04交叉编译vlc2.1.5源码,编译出在win32下运行的程序
- No setter found for property 'adService' in class 'com.shop.action.AdAction'