TL;DR:
不要去修改預設值,除非你知道在做什麼

Lua會自己做記憶體回收,絕大多數時候不必為記憶體分配、管理而操心,而且通常它做的很好。但如果真的因為記憶體回收而影響到程式效率的執行,且你確定你有足夠的記憶體,你可以暫停讓Lua執行記憶體回收的操作:
collectgarbage("stop")
collectgarbage("isrunning") --> false
或者,如果你是嵌入在C,可能會更傾向使用:
lua_gc(L, LUA_GCSTOP)
如果要恢復,也只要:
collectgarbage("restart")
collectgarbage("isrunning") --> true
或是
lua_gc(L, LUA_GCRESTART)
如果你很了解不同種的記憶體收集策略的優劣,Lua提供以下記憶體收集策略:
"collect""stop""step"
"incremental"
"generational"
metatable有一個選項是__mode,可以使表變成是弱表,他有三個值 -- "k"、"v"和"kv"。k就是key,也就是如果表的索引值是可以被回收,而且被回收了,這個欄位也就被回收了。v對應的是value,也就是如果表的值是可以被回收,而且被回收了,這個欄位也就被回收了。kv只要索引值或值其一被回收了,就不在保留該欄位。我們直接拿kv來試試:
collectgarbage("restart") -- 開始自動記憶體回收
weak_table = {}
setmetatable(weak_table, {__mode = "kv"})
key = {}
value = {}
weak_table[key] = 1
weak_table[10] = value
for k, v in pairs(weak_table) do
  print(k, v)  -- {[key] = 1, [10] = value}
end
key = nil
value = nil    -- 不保留(刪除) key, value
collectgarbage()  -- 執行記憶體回收
for k, v in pairs(weak_table) do
  print(k, v)  -- nothing
end

意外嗎?旅途還在繼續,在聽我囉唆幾天XD。
本文同步發表於個人網站