2019独角兽企业重金招聘Python工程师标准>>>

1.垃圾收集

Lua 提供了一个自动的内存管理。 这就是说你不需要关心创建新对象的分配内存操作,也不需要在这些对象不再需要时的主动释放内存。 Lua 通过运行一个垃圾收集器来自动管理内存,以此一遍又一遍的回收死掉的对象 (这是指 Lua 中不再访问的到的对象)占用的内存。 Lua 中所有对象都被自动管理,包括: table, userdata、 函数、线程、和字符串。

Lua 实现了一个增量标记清除的收集器。 它用两个数字来控制垃圾收集周期: garbage-collector pause 和 garbage-collector step multiplier 。

garbage-collector pause 控制了收集器在开始一个新的收集周期之前要等待多久。 随着数字的增大就导致收集器工作工作的不那么主动。 小于 1 的值意味着收集器在新的周期开始时不再等待。 当值为 2 的时候意味着在总使用内存数量达到原来的两倍时再开启新的周期。

step multiplier 控制了收集器相对内存分配的速度。 更大的数字将导致收集器工作的更主动的同时,也使每步收集的尺寸增加。 小于 1 的值会使收集器工作的非常慢,可能导致收集器永远都结束不了当前周期。 缺省值为 2 ,这意味着收集器将以内存分配器的两倍速运行。

你可以通过在 C 中调用 lua_gc 或是在 Lua 中调用 collectgarbage 来改变这些数字。 两者都接受百分比数值(因此传入参数 100 意味着实际值 1 )。 通过这些函数,你也可以直接控制收集器(例如,停止或是重启)。

2.垃圾收集的元方法

使用 C API , 你可以给 userdata (参见 §2.8)设置一个垃圾收集的元方法。 这个元方法也被称为结束子。 结束子允许你用额外的资源管理器和 Lua 的内存管理器协同工作 (比如关闭文件、网络连接、或是数据库连接,也可以说释放你自己的内存)。

一个 userdata 可被回收,若它的 metatable 中有 __gc 这个域 , 垃圾收集器就不立即收回它。 取而代之的是,Lua 把它们放到一个列表中。 最收集结束后,Lua 针对列表中的每个 userdata 执行了下面这个函数的等价操作:

     function gc_event (udata)local h = metatable(udata).__gcif h thenh(udata)endend

在每个垃圾收集周期的结尾,每个在当前周期被收集起来的 userdata 的结束子会以 它们构造时的逆序依次调用。 也就是说,收集列表中,最后一个在程序中被创建的 userdata 的 结束子会被第一个调用。

3,Weak Table(弱表)

weak table 是一个这样的 table,它其中的元素都被弱引用。 弱引用将被垃圾收集器忽略掉, 换句话说, 如果对一个对象的引用只有弱引用, 垃圾收集器将回收这个对象。

weak table 的键和值都可以是 weak 的。 如果一个 table 只有键是 weak 的,那么将运行收集器回收它们的键, 但是会阻止回收器回收对应的值。 而一个 table 的键和值都是 weak 时,就即允许收集器回收键又允许收回值。 任何情况下,如果键和值中任一个被回收了,整个键值对就会从 table 中拿掉。 table 的 weak 特性可以通过在它的 metatable 中设置 __mode 域来改变。 如果 __mode 域中是一个包含有字符 'k' 的字符串时, table 的键就是 weak 的。 如果 __mode 域中是一个包含有字符 'v' 的字符串时, table 的值就是 weak 的。

在你把一个 table 当作一个 metatable 使用之后, 就不能再修改 __mode 域的值。 否则,受这个 metatable 控制的 table 的 weak 行为就成了未定义的。

转载于:https://my.oschina.net/u/2005342/blog/308873

lua4 垃圾收集 collectgarbage相关推荐

  1. lua中的weak table及内存回收collectgarbage

    弱表(weak table)是一个很有意思的东西,像C++/Java等语言是没有的.弱表的定义是:Aweak table is a table whose elements are weak refe ...

  2. lua之弱引用table

    Lua之弱引用table 核心原理:lua的弱引用不增加引用计数 这篇文章主要介绍了Lua教程之弱引用table,本文讲解了自动内存管理的缺陷.弱引用table.三种形式的弱引用等内容,需要的朋友可以 ...

  3. lua学习笔记之垃圾收集

    1.弱表 弱表如何声明呢?通过元表字段__mode来声明,其值必须是字符串,"k"表示关键字是弱的,"v"表示值是弱的,"kv"表示键和值都 ...

  4. ART运行时垃圾收集(GC)过程分析

    ART运行时与Dalvik虚拟机一样,都使用了Mark-Sweep算法进行垃圾回收,因此它们的垃圾回收流程在总体上是一致的.但是ART运行时对堆的划分更加细致,因而在此基础上实现了更多样的回收策略.不 ...

  5. CORE-ESP32C3|eink|墨水屏日历|天气API|LuatOS公共接口|气象要素数据V1|collectgarbage|LuatOS-SOC接口|官方demo|学习(13):墨水屏动态日历

    目录 参考博文 项目官方地址 显示效果: 硬件准备 软件版本 日志及soc下载工具 软件使用 接线示意图 硬件接线 一.Elink驱动管脚适配 二.天气信息获取 API使用方式: 接口格式(注意需不需 ...

  6. Lua语法小贴士(十四)垃圾回收collectgarbage

    Lua垃圾回收只有一个函数collectgarbage,第一个参数是字符串,代表操作类型,第二个参数只有某些操作有,是该操作所需要的参数. 操作类型: stop停止垃圾收集. restart重启垃圾收 ...

  7. collectgarbage

    --collectgarbage (opt [, arg]) --[[功能:是垃圾收集器的通用接口,用于操作垃圾收集器 参数: opt:操作方法标志 "Stop": 停止垃圾收集器 ...

  8. lua - 垃圾回收器collectgarbage

    相关讲解链接(来自菜鸟教程): https://www.runoob.com/lua/lua-garbage-collection.html 代码示例: -- 先统计现有内存使用情况 local me ...

  9. Lua语法 垃圾回收collectgarbage

    Lua垃圾回收只有一个函数collectgarbage,第一个参数是字符串,代表操作类型,第二个参数只有某些操作有,是该操作所需要的参数. 操作类型: stop停止垃圾收集. restart重启垃圾收 ...

最新文章

  1. iOS下JS与OC互相调用(一)--UIWebView 拦截URL
  2. python 跳过迭代_Python迭代和解析(4):自定义迭代器
  3. 技术分享丨关于 Hadoop 的那些事儿
  4. 三层交换机不能完全取代路由的作用
  5. mysql数据库deptno_mysql数据库的 select查询
  6. QT笔记之VS2010 Qt中导入qrc资源文件
  7. BIND配置文件详解(二)
  8. 对于C语言可移植性的思考
  9. 购物商城Web开发第十四天
  10. iOS 不同数据类型存入可变数组
  11. Unity从Asset Store下载的资源安装包默认的保存位置及其修改
  12. 笔记本计算机被限制无法上网,笔记本无线wifi连接受限制的解决办法
  13. 系统漏洞利用与提权攻击机场景
  14. python模拟计算器程序代码_python作业:模拟计算器
  15. 安卓蓝牙设置接收订阅通知断开第二次连接不上或者自动断开status=8的解决办法。
  16. 电驴使用经验谈(转)
  17. 任正非评华为HR胡玲事件,元芳你怎么看?
  18. 基于HTML5的年货购物网站前端网页设计
  19. 生活中什么因素会诱发滑膜炎?
  20. 使用esp 8266物联网开发板 + Mqtt制作远程控制LED小灯

热门文章

  1. 实习的Day1(熟悉环境,安装“环境”)
  2. 看了《一个时代的侧影》
  3. 简单介绍android中什么叫i18n 和L10n
  4. Java Map的key不区分大小写
  5. Commonsense Knowledge Base Completion with Structural and Semantic Context
  6. SQL Server全时区转换
  7. 每月自评之十二:2015年6月
  8. 用数据帮公司省1000万!看看你会不会错过机会
  9. win7无法启动(gpt分区)
  10. 基于FPGA简易电子琴设计+电路原理图+Modelsim 仿真+Quartus II 下载+源代码+激励文件