Lua使用基於被內置在Lua某些算法的垃圾收集自動內存管理。能夠自動內存管理的結果,做爲一個開發者:html
沒有必要擔憂的對象分配內存。算法
無需釋放他們時,再也不須要可將其設置爲nil。 app
Lua使用運行不時收集死的對象時,再也不從Lua程序中訪問垃圾收集器。函數
全部對象,包括表,用戶數據,函數,線程,字符串等受自動內存管理。 Lua使用增量標記和使用兩個數字來控制其垃圾回收週期即垃圾收集暫停和垃圾收集器的步驟事半功倍清除收集器。這些值是在百分比和100的值是常等於1。性能
垃圾收集停頓被用於控制多長時間的垃圾收集器須要等待,以前;它是由Lua的自動內存管理再次調用。數值低於100就意味着Lua中不會等待下一個週期。此值的相似地較高的值將致使垃圾收集器是緩慢的而且性質上較不積極。200表示該集合等待的總內存在使用中要開始一個新的週期開始前的兩倍。所以,根據不一樣的性質和應用的速度,有可能要求改變該值來得到在Lua應用的最佳性能。spa
這一步乘數控制垃圾收集在Lua程序的內存分配的相對速度。較大的步長值將致使垃圾收集器要更侵蝕性,同時也提升了垃圾收集的每一個增量步的步長大小。值小於100可能常常致使避免垃圾收集器沒有完成其週期和其通常不是優選的。默認值是200,這意味着垃圾收集器運行的兩倍的內存分配的速度。操作系統
做爲開發人員,咱們確實有過讓Lua自動內存管理。爲此,有如下幾種方法。線程
collectgarbage("collect"): 執行垃圾回收的一個完整週期。rest
collectgarbage("count"): 返回當前使用的千字節的程序內存量code
collectgarbage("restart"): 若是垃圾收集器已經中止,將從新啓動它。
collectgarbage("setpause"): 設置給定爲第二參數除以100至垃圾收集器暫停變量的值。它的用途是做爲討論的一點上面。
collectgarbage("setstepmul"): 設置給定爲第二參數除以100到垃圾步驟乘數的變量的值。它的用途是做爲討論的一點上面。
collectgarbage("step"): 運行垃圾回收的一步。第二個參數是越大step也會變大。在收集的垃圾將返回true,若是觸發的步驟是一個垃圾收集週期的最後一步。
collectgarbage("stop"): 中止垃圾收集器,若是它的運行。
使用垃圾收集器例如一個簡單的例子以下所示。
mytable = {"apple", "orange", "banana"} print(collectgarbage("count")) mytable = nil print(collectgarbage("count")) print(collectgarbage("collect")) print(collectgarbage("count"))
當咱們運行上面的程序,會獲得下面的輸出。請注意,這樣的結果會有所不一樣,因爲在操做系統中,Lua自動內存管理功能可能也有差別。
20.9560546875 20.9853515625 0 19.4111328125
能夠在上面的程序看出,一旦垃圾回收完成後,既能夠減小使用內存。可是它也不是強制性的調用。即便咱們不給調用,它也會自動在後一階段在預約時間以後由Lua解釋器執行。
顯然咱們能夠改變,若是須要使用垃圾收集器的這些功能行爲。這些功能提供了一點額外的能力,爲開發者處理複雜狀況。根據不一樣的內存須要執行程序類型,可能會或可能不會使用此功能。但在應用程序的內存使用狀況,並在程序自己,以免在部署後不想要對結果進行檢查。