每天一点点----项目中關鍵字 “ collectgarbage”
来源:互联网 发布:网络里马鹿是什么意思 编辑:程序博客网 时间:2024/05/16 06:47
function __G__TRACKBACK__(msg)
print("----------------------------------------")
print("LUA ERROR: " .. tostring(msg) .. "\n")
-- print(debug.traceback())
print("----------------------------------------")
end
local function main()
-- avoid memory leak
collectgarbage("setpause", 100)
collectgarbage("setstepmul", 5000)
-- require('mobdebug').start()
game = require("game");
game:startup();
end
xpcall(main, __G__TRACKBACK__)
1.collectgarbage 关键词 -- 英文(garbage 垃圾 collect 收集) -- 简称 GC
collectgarbage的使用方法是collectgarbage("AAA"), AAA 不同的值代表的意思也不一样
2.為什麼下面這兩句話要放在main的開頭?
collectgarbage("setpause", 100)
collectgarbage("setstepmul", 5000)
網上搜索的結果展示
看两段代码 ,他们最大的区别就是一个是全局变量,另一个是本地局部变量。
跟调用test2前相比,即使Lua进行了内存回收, 内存却不会将下来 看来, 这300K(25906K-25620K)内存, 由于已放到了全局函数中,是永远没有机会被回收到了!
总结一: 如何监测Lua的编程产生内存泄露:
1. 针对会产生泄露的函数,先调用collectgarbage("count"),取得最初的内存使用
2. 函数调用后, collectgarbage("collect")进行收集, 并使用collectgarbage("count")再取得当前内存, 最后记录两次的使用差
3. 从test1的收集可看到, collectgarbage("collect")被调用,并不保证一次成功, 所以, 大可以调用多次
总结二: 如何避免Lua应用中出现的内存使用过大行为:
1. 当然是代码实现不出现泄露, (废话*&%$()
2. 在测试中,其实还发现, Lua中被分配的内存,其实并不会自动回收(个人估计要么就是Lua虚拟机没有做这个事情,要么就是回收的时机是在C层), 所以, 为了避免内存过大, 应用的运行时,可能需要定期的(调用collectgarbage("collect"),又或者collectgarbage("step"))进行显式回收。
作为开发人员,我们确实有过让Lua自动内存管理。为此,有以下几种方法。
- collectgarbage (opt [, arg])
功能:是垃圾收集器的通用接口,用于操作垃圾收集器
参数:
opt:操作方法标志
"Stop": 停止垃圾收集器。在调用重启前,收集器只会因显式的调用运行。
"Restart": 重启垃圾收集器
"Collect": 执行一次全垃圾收集循环
"Count": 返回当前Lua中使用的内存量(以KB为单位)。 以 K 字节数为单位返回 Lua 使用的总内存数。 这个值有小数部分,所以只需要乘上 1024 就能得到 Lua 使用的准确字节数(除非溢出)
"Step": 单步执行一个垃圾收集. 步长 "Size" 由参数arg指定 (大型的值需要多步才能完成),如果要准确指定步长,需要多次实验以达最优效果。如果步长完成一次收集循环,将返回True
"Setpause": 设置 arg/100 的值作为暂定收集的时长。将 arg 设为收集器的 间歇率 。 返回 间歇率 的前一个值。
"Setstepmul": 设置 arg/100 的值,作为步长的增幅(即新步长=旧步长*arg/100)。返回 步进倍率 的前一个值。
- collectgarbage("setpause", 100)
collectgarbage("setstepmul", 5000)
- 每天一点点----项目中關鍵字 “ collectgarbage”
- 【每天进步一点点】 项目管理(1)
- 【每天进步一点点】 项目管理(2)
- 【每天进步一点点】 项目管理(3)
- 每天一点点
- 每天一点点
- 每天一点点
- collectgarbage
- 每天进步一点点——Swift项目实践
- 每天进步一点点——leveldb项目实践
- 每天总结一点点,每天进步一点点!
- 每天变好一点点【转】
- 每天进步一点点
- 每天进步一点点
- 每天进步一点点
- 每天进步一点点
- 每天进步一点点
- 每天进步一点点
- 如何在本地环境配置github
- 图解Android事件传递之View篇
- C++扫雷
- 白书练习 二叉树的重构
- LEETCODE-- Valid Sudoku
- 每天一点点----项目中關鍵字 “ collectgarbage”
- C++ previous declaration of...with 'C++' linkage
- C++/MFC修行之路(3) MFC中各个类的互相访问/取指针
- HDU 1004.Let the Balloon Rise【找出出现次数最多的字符串】
- js中cookie的使用
- 互联网电视
- spring4+hessian实例^_^
- 不无聊的序列(Non-boring sequences,Bzoj4059,CERC2012)
- SOAP webserivce 和 RESTful webservice 的那些事