垃圾回收.jpg
前言#
今天的函數(shù)涉及到垃圾回收機制蛤育,是lua中很重要的一部分,這是c/c++所不具備的功能,為今天我們就總結(jié)一下這個函數(shù)的簡單用法饶米,更高難度的用法大家可以根據(jù)定義自己嘗試一下恒界。
內(nèi)容#
collectgarbage ()##
- 原型:collectgarbage ([opt [, arg]])
- 解釋:這個函數(shù)是垃圾回收機制的一個通用接口睦刃,根據(jù)它的第一個參數(shù)
opt
會展現(xiàn)出不同的功能,具體解釋如下: -
"collect"
:執(zhí)行一個完整的垃圾回收周期十酣,這是一個默認的選項涩拙。 -
"stop"
:停止垃圾收集器(如果它在運行)际长。 -
"restart"
:將重新啟動垃圾收集器(如果它已經(jīng)停止)。 -
"count"
:返回當(dāng)前使用的的程序內(nèi)存量(單位是Kbytes)兴泥。 -
"step"
:執(zhí)行垃圾回收的步驟工育,這個步驟的大小由參數(shù)arg
(較大的數(shù)值意味著較多的步驟)以一種不特定的方式來決定,如果你想控制步驟的大小搓彻,你必須實驗性的調(diào)整參數(shù)arg
的值如绸,如果這一步完成了一個回收周期則函數(shù)返回true
。 -
"setpause"
:給參數(shù)arg
設(shè)置一個新值旭贬,用于設(shè)置回收器的暫停參數(shù)怔接,并返回原來的暫停數(shù)值。 -
"setstepmul"
:給參數(shù)arg
設(shè)置一個新值骑篙,用于設(shè)置回收器的步進乘數(shù)蜕提,并返回原來的步驟的值。
usage##
- 首先我們新建一個文件將文件命名為collectgarbagetest.lua然后編寫代碼如下:
local x = 1
local y = 2
local z = 3;
-- 先統(tǒng)計現(xiàn)有內(nèi)存使用情況
local mem1 = collectgarbage("count")
print("\ninit memory is", mem1, "kb")
-- 申請一些內(nèi)存
local local_list = {}
for i=1,100 do
local v = {}
for i=1,10 do
table.insert(v, i* 6)
end
table.insert(local_list, v)
end
local mem2 = collectgarbage("count")
print("\nafter apply memory is", mem2, "kb")
-- 內(nèi)存回收
collectgarbage("collect")
-- 檢查回收完的內(nèi)存
local mem3 = collectgarbage("count")
print("\nafter collect memory is", mem3, "kb")
local_list = nil
-- 再次內(nèi)存回收
collectgarbage("collect")
-- 檢查回收完的內(nèi)存
local mem4 = collectgarbage("count")
print("\nafter collect again memory is", mem4, "kb")
- 運行結(jié)果
base_collectgarbage.png
總結(jié)#
- Lua使用增量標(biāo)記和使用兩個數(shù)字來控制其垃圾回收周期即利用垃圾收集暫停數(shù)字和垃圾收集器的步進乘數(shù)來控制回收機制靶端。
- 由所給的例子可以看出當(dāng)
local_list
被設(shè)置成nil
時谎势,函數(shù)的回收機制才生效,其實如果出了參數(shù)的作用域杨名,垃圾回收也是會生效的脏榆。 - 選項
setpause
的使用方法:collectgarbage("setpause", 200)
,表示當(dāng)收集器在總使用內(nèi)存數(shù)量達到上次垃圾收集時的兩倍時再開啟新的收集周期台谍。 - 選項
setstepmul
的使用方法:collectgarbage("setstepmul", 200)
须喂,表示垃圾收集器的運行速度是內(nèi)存分配的2倍,如果此值小于100可能會導(dǎo)致垃圾回收不能形成完整的周期趁蕊。 - 既然垃圾回收可以節(jié)省內(nèi)存坞生,是不是在lua中頻繁調(diào)用函數(shù)
collectgarbage()
會提高性能?實踐表明掷伙,反復(fù)垃圾回收反而會明顯降低性能是己。 - 其實不僅是lua,很多語言都是這樣的任柜,而lua的增量式gc在大部分時候都工作的很好卒废。除了界面切換等將要發(fā)生大量資源載入的時候,否則還是盡量不要去手動回收比較好宙地。