文档章节

lua4 垃圾收集 collectgarbage

x
 xiao理想
发布于 2014/09/01 20:53
字数 1035
阅读 30
收藏 1


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).__gc
       if h then
         h(udata)
       end
     end

在每个垃圾收集周期的结尾,每个在当前周期被收集起来的 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 行为就成了未定义的。


本文转载自:http://manual.luaer.cn/

x
粉丝 1
博文 22
码字总数 6276
作品 0
广州
私信 提问
第一个Cocos2d-x Lua游戏

我们的编写的第一个Cocos2d-x Lua程序,命名为HelloLua,从该工程开始学习其它的内容。 创建工程 我们创建Cocos2d-x Lua工程可以通过Cocos2d-x提供的命令工具cocos实现,但这种方式不能与Coc...

智捷课堂
2015/05/06
137
0
第一个Cocos2d-x Lua游戏

我们的编写的第一个Cocos2d-x Lua程序,命名为HelloLua,从该工程开始学习其它的内容。 创建工程 我们创建Cocos2d-x Lua工程可以通过Cocos2d-x提供的命令工具cocos实现,但这种方式不能与Coc...

智捷课堂
2015/05/07
73
0
extjs tabPanel关闭tab页,内存没释放

使用extjs tabPanel时,关闭tab页,内存没释放,浏览器是ie,强制使用CollectGarbage()垃圾收回器,也不行。如何解决这个问题。

hxw4836
2013/10/15
1K
2
JVM:这是一份全面 & 详细的 (GC)垃圾收集器讲解指南

前言 垃圾收集器 是 垃圾收集算法 的具体实现 本文将对市面上常见的垃圾收集器类型进行讲解,希望你们会喜欢 在接下来的日子,我会推出一系列讲解的文章,具体如下;感兴趣可持续关注Carson_...

Carson_Ho
2018/10/23
0
0
Java的垃圾回收之算法

引言 Java的堆是一个运行时数据区,类的实例(对象)从中分配空间。Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new、newarray、anewarray和multianewarray等...

青夜之衫
2017/12/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

VMware vSphere ESXi主机的访问控制

在vShpere中,访问ESXi主机的途径很多,如下: ESXi DCUI ESXi Shell ESXi SSH ESXi Host Client vCenter --> vSphere web client / vSphere Client VMware vSphere ESXi主机的访问控制,除了......

大别阿郎
35分钟前
4
0
大神讲解CGI、FastCGI和PHP-FPM关系图解

参考资料 概念了解:CGI,FastCGI,PHP-CGI与PHP-FPM:http://www.nowamagic.net/librarys/veda/detail/1319 php中fastcgi和php-fpm是什么东西:https://www.zybuluo.com/phper/note/50231 ......

网络小虾米
45分钟前
4
0
《DNS攻击防范科普系列3》 -如何保障 DNS 操作安全

引言 前两讲我们介绍了 DNS 相关的攻击类型,以及针对 DDoS 攻击的防范措施。这些都是更底层的知识,有同学就来问能否讲讲和我们的日常操作相关的知识点,今天我们就来说说和我们日常 DNS 操...

Mr_zebra
45分钟前
4
0
zk中ServerCnxn

实现接口Stats, Watcher 内部类 DisconnectReason CloseRequestException EndOfStreamException(流关闭) 属性 方法 getSessionTimeout 获取session失效时间 sendResponse 发送回复数据 se......

writeademo
50分钟前
4
0
如何将 Redis 用于微服务通信的事件存储

来源:Redislabs 作者:Martin Forstner 翻译:Kevin (公众号:中间件小哥) 以我的经验,将某些应用拆分成更小的、松耦合的、可协同工作的独立逻辑业务服务会更易于构建和维护。这些服务(也...

中间件小哥
53分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部