Lua使用自動記憶體管理,該管理使用基於Lua內置的某些演算法的垃圾收集。自動記憶體管理收集,作為開發人員 -
- 無需擔心為對象分配記憶體。
- 除非將其設置為零,否則無需在不再需要時釋放它們。
Lua使用垃圾收集器它在後臺會時不時地運行,收集和銷毀Lua程式訪問的死對象。
包括表,用戶數據,函數,線程,字串等在內的所有對象都需要進行自動記憶體管理。 Lua使用增量標記和掃描收集器,它使用兩個數字來控制其垃圾收集週期,即垃圾收集器暫停和垃圾收集器步驟倍增器。 這些值以百分比表示,值100
通常在內部等於1
。
垃圾收集器暫停
垃圾收集器暫停用於控制垃圾收集器之前需要等待多長時間; Lua的自動記憶體管理再次調用。 小於100
的值意味著Lua不會等待下一個週期。 類似地,該值的較高值將導致垃圾收集器緩慢。 200
的值表示收集器在開始新迴圈之前等待使用的總記憶體加倍。 因此,根據應用程式的性質和速度,可能需要更改此值以在Lua應用程式中獲得最佳性能。
垃圾收集器步驟乘數
此步驟乘數控制垃圾收集器與Lua程式中記憶體分配的相對速度。 較大的步長值將導致垃圾收集器更具侵略性,並且還會增加垃圾收集的每個增量步驟的步長。 小於100
的值通常可以避免垃圾收集器不完成迴圈並且通常不是優選的。 默認值為200
,這意味著垃圾收集器的運行速度是記憶體分配的兩倍。
垃圾收集器函數
作為開發人員,確實可以控制Lua中的自動記憶體管理。有以下方法可以使用。
collectgarbage("collect")
-運行一個完整的垃圾收集迴圈。collectgarbage("count")
- 返回程式當前以千位元組為單位的記憶體量。collectgarbage("restart")
- 如果垃圾收集器已停止,則重新啟動它。collectgarbage("setpause")
- 將給定的值作為第二個參數除以100
,將它設置為垃圾收集器暫停變數。collectgarbage("setstepmul")
- 將給定的值作為第二個參數除以100
,將它設置為垃圾步驟乘數變數。collectgarbage("step")
- 運行垃圾收集的一步。第二個參數越大,此步驟越大。 如果觸發的步驟是垃圾收集週期的最後一步,則collectgarbage
將返回true
。collectgarbage("stop")
- 如果垃圾收集器正在運行,則停止它。
使用垃圾收集器示例如下所示。
mytable = {"apple", "orange", "banana"}
print(collectgarbage("count"))
mytable = nil
print(collectgarbage("count"))
print(collectgarbage("collect"))
print(collectgarbage("count"))
當運行上面的程式時,將得到以下輸出。 請注意,由於操作系統類型的不同以及Lua的自動記憶體管理功能,此結果會有所不同。
23.1455078125 149
23.2880859375 295
0
22.37109375 380
在上面的程式中看到,完成垃圾收集,它就減少了使用的記憶體。 但是,這並不是強制要求。 即使不調用它們,它也會在預定義的時間段後由Lua解釋器在稍後階段自動執行。
顯然,如果需要,可以使用這些函數來改變垃圾收集器的行為。 這些函數為開發人員提供了一些額外的功能來處理複雜的情況。 根據程式所需的記憶體類型,也可能不會使用此功能。 但瞭解應用程式中的記憶體使用情況並在編程期間檢查它以避免在部署後出現意外結果非常有用。