lua垃圾回收机制

Lua中的多数回收都是通过垃圾回收器自动完成的。Lua使用渐进式垃圾回收器,意味着垃圾回收工作会被分成很多小步,(渐进地)在程序的允许过程中执行。渐进的节奏与内存分配的速度成比例,每当分配一定量的内存,就会按比例地回收相应的内存;程序消耗内存越快,垃圾回收器尝试回收内存也就越快。

如果我们在编写程序时遵循削减和重用的原则,通常垃圾回收器不会有太多的事情要做。但是有时我们无法避免制造大量的垃圾,垃圾回收器的工作也会变得非常繁重。Lua中的垃圾回收器被调节为适合平均水平的程序,因此它在多数程序中工作良好。但是,在特定的时候我们可以通过调整垃圾回收器来获取更好的性能。通过在Lua中调用函数collectgarbage,或者在C中调用lua_gc,来控制垃圾回收器。它们的功能相同,只不过有不同的接口。在本例中我将使用Lua接口,但是这种操作通常在C中进行更好。

collectgarbage函数提供若干种功能:它可以停止或者启动垃圾回收器、强制进行一次完整的垃圾回收、获取Lua占用的总内存,或者修改影响垃圾回收器工作节奏的两个参数。它们在调整高内存消耗的程序时各有用途。

“永远”停止垃圾回收器可能对于某些批处理程序很有用。这些程序创建若干数据结构,根据它们生产出一些输出值,然后退出(例如编译器)。对于这样的程序,试图回收垃圾将会是浪费时间,因为垃圾量很少,而且内存会在程序执行完毕后完整释放。

对于非批处理程序,停止垃圾回收器则不是个好主意。但是,这些程序可以在某些对时间极度敏感的时期暂停垃圾回收器,以提高时间性能。如果有需要的话,这些程序可以获取垃圾回收器的完全控制,使其始终处于停止状态,仅在特定的时候显式地进行一次强制的步进或者完整的垃圾回收。例如,很多事件驱动的平台都提供一个选项,可以设置空闲函数,在没有消息需要处理时调用。这正是调用垃圾回收的绝好时机(在Lua 5.1中,每当你在垃圾回收器停止的状态下进行强制回收,它都会恢复运转,因此,如果要保持垃圾回收器处于停止状态,必须在强制回收后立刻调用collectgarbage("stop"))。

最后,你可能希望实施调整回收器的参数。垃圾回收器有两个参数用于控制它的节奏:第一个,称为暂停时间,控制回收器在完成一次回收之后和开始下次回收之前要等待多久;第二个参数,称为步进系数,控制回收器每个步进回收多少内容。粗略地来说,暂停时间越小、步进系数越大,垃圾回收越快。这些参数对于程序的总体性能的影响难以预测,更快的垃圾回收器显然会浪费更多的CPU周期,但是它会降低程序的内存消耗总量,并可能因此减少分页。只有谨慎地测试才能给你最佳的参数值。

一、检测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"))进行显式回收。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值