# Lua 垃圾回收
Lua 采用了自動內存管理。 這意味著你不用操心新創建的對象需要的內存如何分配出來, 也不用考慮在對象不再被使用后怎樣釋放它們所占用的內存。
Lua 運行了一個**垃圾收集器**來收集所有**死對象** (即在 Lua 中不可能再訪問到的對象)來完成自動內存管理的工作。 Lua 中所有用到的內存,如:字符串、表、用戶數據、函數、線程、 內部結構等,都服從自動管理。
Lua 實現了一個增量標記-掃描收集器。 它使用這兩個數字來控制垃圾收集循環: 垃圾收集器間歇率和垃圾收集器步進倍率。 這兩個數字都使用百分數為單位 (例如:值 100 在內部表示 1 )。
垃圾收集器間歇率控制著收集器需要在開啟新的循環前要等待多久。 增大這個值會減少收集器的積極性。 當這個值比 100 小的時候,收集器在開啟新的循環前不會有等待。 設置這個值為 200 就會讓收集器等到總內存使用量達到 之前的兩倍時才開始新的循環。
垃圾收集器步進倍率控制著收集器運作速度相對于內存分配速度的倍率。 增大這個值不僅會讓收集器更加積極,還會增加每個增量步驟的長度。 不要把這個值設得小于 100 , 那樣的話收集器就工作的太慢了以至于永遠都干不完一個循環。 默認值是 200 ,這表示收集器以內存分配的"兩倍"速工作。
如果你把步進倍率設為一個非常大的數字 (比你的程序可能用到的字節數還大 10% ), 收集器的行為就像一個 stop-the-world 收集器。 接著你若把間歇率設為 200 , 收集器的行為就和過去的 Lua 版本一樣了: 每次 Lua 使用的內存翻倍時,就做一次完整的收集。
## 垃圾回收器函數
Lua 提供了以下函數**collectgarbage ([opt [, arg]])**用來控制自動內存管理:
* **collectgarbage("collect"):** 做一次完整的垃圾收集循環。通過參數 opt 它提供了一組不同的功能:
* **collectgarbage("count"):** 以 K 字節數為單位返回 Lua 使用的總內存數。 這個值有小數部分,所以只需要乘上 1024 就能得到 Lua 使用的準確字節數(除非溢出)。
* **collectgarbage("restart"):** 重啟垃圾收集器的自動運行。
* **collectgarbage("setpause"):** 將 arg 設為收集器的 間歇率 (參見 §2.5)。 返回 間歇率 的前一個值。
* **collectgarbage("setstepmul"):** 返回 步進倍率 的前一個值。
* **collectgarbage("step"):** 單步運行垃圾收集器。 步長"大小"由 arg 控制。 傳入 0 時,收集器步進(不可分割的)一步。 傳入非 0 值, 收集器收集相當于 Lua 分配這些多(K 字節)內存的工作。 如果收集器結束一個循環將返回 true 。
* **collectgarbage("stop"):** 停止垃圾收集器的運行。 在調用重啟前,收集器只會因顯式的調用運行。
以下演示了一個簡單的垃圾回收實例:
```
mytable = {"apple", "orange", "banana"}
print(collectgarbage("count"))
mytable = nil
print(collectgarbage("count"))
print(collectgarbage("collect"))
print(collectgarbage("count"))
```
執行以上程序,輸出結果如下(注意內存使用的變化):
```
20.9560546875
20.9853515625
0
19.4111328125
```
- Lua 簡介
- Lua 環境安裝
- Lua 數據類型
- Lua 變量
- Lua 循環
- Lua while 循環
- Lua for 循環
- Lua repeat...until 循環
- Lua 循環嵌套
- Lua break 語句
- Lua 流程控制
- Lua if 語句
- Lua if...else 語句
- Lua if 嵌套語句
- Lua 函數
- Lua 運算符
- Lua 字符串
- Lua 數組
- Lua 迭代器
- Lua table(表)
- Lua 模塊與包
- Lua 元表(Metatable)
- Lua 協同程序(coroutine)
- Lua 文件 I/O
- Lua 錯誤處理
- Lua 調試(Debug)
- Lua 垃圾回收
- Lua 面向對象
- Lua 數據庫訪問