• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

lua垃圾回收机制

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C与Lua互相调用的时候,栈变化分析发布时间:2022-07-22
下一篇:
Lua:使用MinGW编译Lua5.2.3发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap