Lua五:”collectgarbage”、 弱引用table、析构器「建议收藏」

Lua五:”collectgarbage”、 弱引用table、析构器「建议收藏」Lua具有自动内存回收机制,但是垃圾收集器只能回收那些它认为是垃圾的东西,不会回收那些用户认为是垃圾的东西。比如将一个对象放在一个数组中但没有用时,它就无法被回收,这是因为即使当前没有其他地方在使用它

大家好,又见面了,我是你们的朋友全栈君。

       Lua具有自动内存回收机制,但是垃圾收集器只能回收那些它认为是垃圾的东西,不会回收那些用户认为是垃圾的东西。比如将一个对象放在一个数组中但没有用时,它就无法被回收,这是因为即使当前没有其他地方在使用它,但数组仍引用着它,除非用户告诉Lua这项引用不应该阻碍此对象的回收,否则Lua是无从得知的。

       Lua垃圾回收函数collectgarbage,这个函数是垃圾回收机制的一个通用接口,其第一个参数是字符串,代表操作类型,第二个参数只有某些操作有,是该操作所需要的参数。其原型:collectgarbage ([opt [, arg]])

操作类型:

  • “collect”:执行一个完整的垃圾回收周期,这是一个默认的选项。
  • “stop”:停止垃圾收集器(如果它在运行),直到再次使用操作为”restart”的圾回收函数collectgarbage。
  • “restart”:将重新启动垃圾收集器(如果它已经停止)。
  • “count”:返回当前使用的的程序内存量(单位是Kbytes)。
  • “step”:执行垃圾回收的步骤,这个步骤的大小由参数arg(较大的数值意味着较多的步骤)以一种不特定的方式来决定,如果你想控制步骤的大小,你必须实验性的调整参数arg的值,如果这一步完成了一个回收周期则函数返回true。
  • “setpause”:第二个参数pause 用于控制垃圾收集器在一次收集完成后等待多久再开始新的一次收集。当值为零时表示 Lua语言在上一次垃圾回收结束后立即开始一次新的收集。当值为200%时表示在重启垃圾收集器前等待内存使用翻番。如果想使消耗更多的CPU时间换取更低的内存消耗,那么可以把这个值设得小一点。通常,我们应该把这个值设在О到200%之间。
  • “setstepmul”:参数stepmul控制对于每分配1KB内存,垃圾收集器应该进行多少工作。这个值越高,垃圾收集器使用的增量越小。一个像100000000%一样巨大的值会让收集器表现得像一个非增量的垃圾收集器。默认值是 200%。低于100%的值会让收集器运行得很慢,以至于可能一次收集也完不成。

       两个参数pause和stepmul控制着垃圾收集器的角色。任何垃圾收集器都是使用CPU时间换内存空间。在极端情况下,垃圾收集器可能根本不会运行。但是,不耗费CPU时间是以巨大的内存消耗为代价的。在另外一种极端的情况下,收集器可能每进行一次赋值就得运行一次完整的垃圾收集。程序能够使用尽可能少的内存,但是是以巨大的CPU消耗为代价的。pause 和stepmul的默认值正是试图在这两个极端之间找到的对大多数应用来说足够好的平衡点。

       选项setpause的使用方法:collectgarbage(“setpause”, 200),表示当收集器在总使用内存数量达到上次垃圾收集时的两倍时再开启新的收集周期。

       选项setstepmul的使用方法:collectgarbage(“setstepmul”, 200),表示垃圾收集器的运行速度是内存分配的2倍,如果此值小于100可能会导致垃圾回收不能形成完整的周期。

 

       table中有key和value,这两者都可以包含任意类型的对象。通常,垃圾收集器不会回收一个可访问table中作为key或value的对象。也就是说,这些key和value都是强引用,它们会阻止对其所引用对象的回收。在一个弱引用table中,key和value是可以回收的。

       弱引用table(weak table)是用户用来告诉Lua一个引用不应该阻碍对该对象的回收。所谓弱引用,就是一种会被垃圾收集器忽视的对象引用。如果一个对象的引用都是弱引用,该对象也会被回收。

       弱引用table有3种类型:1、具有弱引用key的table;2、具有弱引用value的table;3、同时具有弱引用key和value的table;

       table的弱引用类型是通过其元表中的__mode字段来决定的。这个字段的值应为一个字符串:如果包含’k’,那么这个table的key是弱引用的;如果包含’v’,那么这个table的value是弱引用的;

       弱引用table的一个例子,这里使用了collectgarbage函数强制进行一次垃圾收集:

 1 a = {}
 2 setmetatable(a, {__mode='k'})
 3 
 4 key = {}
 5 a[key] = 'key1'
 6 
 7 key = {}
 8 a[key] = 'key2'
 9 
10 collectgarbage()

      该段代码“collectgarbage()”运行前,表a同时存在key为{}和value为’key1’和’key2’的对象,“collectgarbage()”运行后,只存在key为{}和value为’key2’的对象。

 

      析构器_gc简单来说,就是当一个table的元表中存在_gc时,就会在这个lua table被gc释放掉之前,调用的函数。不过,在5.2之前,_gc只能用在userdata中,而5.2及5.2之后,table也可以用__gc了。

 1 function class(name, super)
 2    ...
 3     -- 析构函数
 4     if cls.dtor then
 5         cls.dtor = function(self) end
 6     end
 7 
 8     cls.__meta = {__index = cls, __gc = function(self) self:dtor() end}
 9     cls.new = function(...)
10         local obj = setmetatable({}, cls.__meta)
11         obj:ctor(...)
12         return obj 
13     end
14     return cls
15 end

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154976.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • javaweb英文文献_关于java的书籍文献

    javaweb英文文献_关于java的书籍文献您所在位置:网站首页>海量文档&nbsp>&nbsp计算机&nbsp>&nbspJavaJAVAWeb外文文献毕业设计.doc10页本文档一共被下载:次,您可全文免费在线阅读后下载本文档。下载提示1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。2.该文档所得收入(下…

    2022年9月26日
    0
  • NicEdit和Kindeditor配置

    NicEdit和Kindeditor配置推荐两款富文本编辑器:NicEdit和Kindeditor做过Web开发的朋友相信都使用过富文本编辑器,比较出名的CuteEditor和CKEditor很多人应该已经使用过,在功能强大的同时需要加载的东西也变得很多。下面要推荐的两款富文本编辑器都是使用JS编写,使用简单,非常轻量级。NicEditorNicEdit是一个轻量级,跨平台的InlineContentEditor…

    2022年10月12日
    0
  • kali 目录扫描_kali扫描命令

    kali 目录扫描_kali扫描命令1、简介dirsearch是一个基于python3的命令行工具,常用于暴力扫描页面结构,包括网页中的目录和文件。相比其他扫描工具disearch的特点是:支持HTTP代理多线程支持多种形式的网页(asp,php)生成报告(纯文本,JSON)启发式检测无效的网页递归扫描用户代理随机化批量处理扫描器与字典(注:字典必须是文本文件)2、下载及安装GitHub的下载地址为:https://github.com/maurosoria/dirsearchWindows10安装方式点击c

    2022年9月26日
    0
  • 机器学习框架及评估指标详解

    机器学习框架及评估指标详解目录机器学习的步骤train_test_split函数的详解机器学习评估指标分类模型评估指标混淆矩阵ROC曲线利用ROC的其他评估标准Python绘制ROC曲线求解AUC模板代码错误率精度查准率、查全率P-R曲线Python绘制P-R曲线模板代码平衡点(BEP)F1度量Python求解F1_score代码回归模型评估指标均方误差MAE(平均绝对误差)MAPE(平均绝对百分比误差)RMSE(均方根误差)RSquare(

    2022年6月16日
    26
  • 解析数据中心监控系统功能作用

    解析数据中心监控系统功能作用数据中心机房监控系统是什么?其主要功能作用有哪些?下面机房监控系统厂家-深圳计通小编就拿计通机房监控来举例:为保证机房的安全、稳定和高效运行,保证网络设备良好的运行状态和设备使用寿命与安全,从而实现用户的最大投资效益。机房监控系统对网络运行环境的电力供应、温度、湿度、漏水、空气含尘量等诸多环境变量,UPS、空调、新风、除尘、除湿等诸多设备运行状态变量,进行24小时实时监测与智能化调节…

    2022年7月15日
    11
  • HTTP 和 HTTPS 的区别(面试常考题)「建议收藏」

    HTTP 和 HTTPS 的区别(面试常考题)「建议收藏」无论是在校学习还是找工作的时候,老师和面试官都问过同学http和https的区别。平时上网的时候也没有关注这个问题,只是知道计算机网络里Http的概念,所以最近才查资料好好补补这一块。其实这一块的知识延伸很广,如果之前不太了解加密算法和SSL协议,可以在学习了这个问题的基础上再做研究。一、Http和Https的基本概念Http:超文本传输协议(Http,HyperTextTrans…

    2022年6月28日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号