Lua的内存监测和回收 lua垃圾回收

Lua内存是自动收集的,这点跟Java类似,不被任何对象或全局变量引用的数据,将被首先标记为回收,不需要开发者做任何事情.但是,正如Java也会有内存泄露一样, Lua也会有,只不过,跟C++的不同,它是由于代码执行所装载的资源,并没有被彻底销毁而导致,其中,最臭名昭著的就是不小心把局部变量声明成了全局变量(忘了加local修饰符)。类似这样造成的内存泄露,跟任何其他语言的内存泄露一样,容易产生,却难以察觉,给开发的应用带来潜在的很大隐患.

那么,有没有一些有效的解决办法,来解决这个这个隐患呢,答案就是collectgarbage.collectgarbage就是开放给Lua开发人员,用于监听Lua的内存使用情况(collectgarbage("count")),同时,它还提供了collectgarbage("collect"),允许在适当的时候进行显式的回收.

现在,通过测试代码来看看,如何玩转collectgarbage.

首先,为了有明显的对比,先来看没有产生泄露的情况,运行以下的test1(代码如下):

运行结果如下:



这里看到, 被local 声明的colen加了5000数组, test1调用后, 内存增加了大概300K(25906K-25620K).现在,我们来做内存回收(调用mem函数, 代码如下):
Lua的内存监测和回收 lua垃圾回收

运行结果:
(为了保证内存的稳定,以上注意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"))进行显式回收。

  

爱华网本文地址 » http://www.413yy.cn/a/25101018/374644.html

更多阅读

滴水观音的繁殖方法和养殖技巧方法 滴水观音怎样繁殖

滴水观音的繁殖方法和养殖技巧方法——简介滴水观音名字的由来是因为它在开的花非常像观音,而且在水分充足的情况下会从叶子的尖端向下滴水,虽然有这么美的名字,需要注意的是滴水观音的根茎是有毒的,所以在养殖过程中一定要注意。滴水观

怎么增加电脑的内存 台式电脑怎么增加内存

怎么增加电脑的内存——简介很多电脑买来的时候完全能够满足使用,但是时间长了就满足不了怎么增加电脑的内存——工具/原料内存条和螺丝刀怎么增加电脑的内存——方法/步骤怎么增加电脑的内存 1、首先的话,如果你的电脑内存你觉得不

指令引用的内存不能为read如何解决 指令引用不能为read

指令引用的内存不能为read如何解决——简介内存指令不能read或written,这是在电脑使用中经常出现的问题,内存是主板上的存储部件,是CPU直接与之沟通,并用其存放当前正在使用的(即执行中)的数据和命令的重要部件。当你用键盘或鼠标输入某

如何通过软件测试妳的内存卡 内存卡测试软件

如何通过软件测试妳的内存卡——简介最近很多人说自己买的便宜的内存卡,用着用着就不能存东西了,或者甚至就不能再读了,也就是所谓的卡烧了,所以结合本人的经验特分享一下。本人以常见的4GB、8GB和16GB的内存卡为例为各位简单介绍一下。

电力监测 电力监测和保护

广州网控通信科技有限公司自主研发的GNC动力和环境集中监控平台,可对电信、电力、银行、政府部门等多个领域的机房动力环境监控、UPS电源监控、远程电源控制、精密空调监控、蓄电池监测、变电站环境监控、变电站无线监控报警等应用提

声明:《Lua的内存监测和回收 lua垃圾回收》为网友交际花分享!如侵犯到您的合法权益请联系我们删除