Lua内存是自动收集的, 这点跟Java类似, 不被任何对象或全局变量引用的数据,将被首先标记为回收,不需要开发者做任何事情.但是,正如Java也会有内存泄露一样, Lua也会有, 只不过,跟C++的不同,它是由于代码执行所装载的资源,并没有被彻底销毁而导致,其中,最臭名昭著的就是不小心把局部变量声明成了全局变量(忘了加local修饰符)。 类似这样造成的内存泄露, 跟任何其他语言的内存泄露一样,容易产生,却难以察觉, 给开发的应用带来潜在的很大隐患.
那么, 有没有一些有效的解决办法, 来解决这个这个隐患呢, 答案就是collectgarbage. collectgarbage就是开放给Lua开发人员, 用于监听Lua的内存使用情况(collectgarbage("count")), 同时,它还提供了collectgarbage("collect"),允许在适当的时候进行显式的回收.
现在,通过测试代码来看看,如何玩转collectgarbage.
首先,为了有明显的对比, 先来看没有产生泄露的情况, 运行以下的test1(代码如下):
运行结果如下:
这里看到, 被local 声明的colen加了5000数组, test1调用后, 内存增加了大概300K(25906K-25620K).
现在,我们来做内存回收(调用mem函数, 代码如下):
运行结果:
(
为了保证内存的稳定,以上注意mem被调用了多次, 再第2次, 可以看到内存开始下降, 最后,大概在25618K稳定下来)
好了, 从最初的25620K, 到回收后的25618K, 两者并没有发生变化(还少了2K,嘿嘿, 这应该是误差了), 也就是说,函数test1的执行,并没有产生无法回收的内存,没有泄露出现.
好了,现在运行有泄露的test2(代码如下), test2跟test1相比,只有一处不同:就是colen被误声明为全局:
结果:
也就是说,内存也在25906K,跟test1几乎是相等, 好了,现在再调用回收(mem)函数,产生结果如下
为了保证函数回收被执行,这次,总共调用了7次mem函数(看以上打印行数), 那么,从上面的结果我们看, 很不幸, 从第1次,到最后第7次, 内存都还是稳定在25905K左右, 也就是说, 跟调用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"))进行显式回收。
- 大小: 2.7 KB
- 大小: 6.3 KB
- 大小: 4.6 KB
- 大小: 5.7 KB
- 大小: 9.2 KB
- 大小: 2.3 KB
- 大小: 2.3 KB
分享到:
相关推荐
Lua内存泄露检测工具LuaMonitor下载.rar 对于Lua的性能检测提供良好的视图分析 可以获取当前内存图,方便对应项目的内存管理 可以获取热点函数相关信息
主要介绍了Lua中的垃圾回收机制,自动的垃圾回收是Lua的重要特性之一,需要的朋友可以参考下
Openretry+lua内存,缓存域名网页 加快加载渲染速度,用了lua缓存和restry.ttp
lua-tablepool - 针对LuaJIT的Lua表格资源回收池
所有版本LUA源码 lua-5.3.5 lua-5.3.4 lua-5.3.3 lua-5.3.2 lua-5.3.1 lua-5.3.0 lua-5.2.4 lua-5.2.3 lua-5.2.2 lua-5.2.1 lua-5.2.0 lua-5.1.5 lua-5.1.4 lua-5.1.3 lua-5.1.2 lua-5.1.1 lua-5.1 lua-5.0.3 lua-...
ios版本将lua加密成luac
内含luaDll,luacom以及luaiconv源码。luaDll和luaiconv直接打开sln在Visual studio中即可进行编译。luacom可使用nmake进行编译。也可直接使用已经生成了的dll.
lua 反编译工具 用于学习lua 反编汇 游戏lua 解密
lua5.3(32位/64位)windows 预编译(exe/DLL) adding: lua5.3.5-x86/lua.exe (in=14336) (out=7311) (deflated 49%) adding: lua5.3.5-x86/lua.o (in=24873) (out=9654) (deflated 61%) adding: lua5.3.5-x86/lua...
lua参考手册和lua常用函数,学习lua很有帮助的资料,希望对大家有用
lua库说明和一些例程,lua元表和元方法,lua基本函数库,lua模式匹配
易语言lua的例子,静态易语言调用LUA51.DLL和模块
如何让EditPlus支持LUA; lua-5.1.4.tar.gz; lua程序设计中文版.pdf; Lua+5.1+参考手册.pdf; Lua一些基本函数.txt; Programming_in_LUA中文版.txt; Lua 5_1 参考手册.mht;
Lua内存快照转储实用程序,用于内存泄漏检测。 关于 关于此代码: : 。 (中国人) 只需运行“ Example.lua”即可快速入门。 与Lua 5.1、5.2和5.3兼容。 支持将按引用计数排序的所有lua对象引用信息转储到本地...
LUA 全套帮助解释,里面详细介绍LUA用法和LUA相关方面的用法,可以很好的帮助我们更好的用LUA,是不可多得的LUA帮助文档
lua-5.1中文手册.chm Lua程序设计.chm
lua for windows其实是一整套Lua的开发环境.Lua for Windows 为 Windows 系统下提供了 Lua 脚本语言的开发和运行环境。Lua 是一个小巧的脚本语言。作者是巴西人。该语言的设计目的是为了嵌入应用程序中,从而为应用...
LUAC 脚本加密 , 用于LUAC 脚本反编译,有用得同学可以下载,
luaapi lua中文