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
使用 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
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 行为就成了未定义的。