lua4 垃圾收集 collectgarbage


1.垃圾收集

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

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

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

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

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


2.垃圾收集的元方法

使用 C API , 你能够给 userdata (参见 §2.8)设置一个垃圾收集的元方法。 这个元方法也被称为结束子。 结束子容许你用额外的资源管理器和 Lua 的内存管理器协同工做 (好比关闭文件、网络链接、或是数据库链接,也能够说释放你本身的内存)。spa

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

     function gc_event (udata)
       local h = metatable(udata).__gc
       if h then
         h(udata)
       end
     end

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


3,Weak Table(弱表)

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

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

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

相关文章
相关标签/搜索