Lua base collectgarbage()

垃圾回收.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ā)生大量資源載入的時候,否則還是盡量不要去手動回收比較好宙地。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摔认,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宅粥,更是在濱河造成了極大的恐慌参袱,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蓖柔,居然都是意外死亡辰企,警方通過查閱死者的電腦和手機风纠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門况鸣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人竹观,你說我怎么就攤上這事镐捧。” “怎么了臭增?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵懂酱,是天一觀的道長。 經(jīng)常有香客問我誊抛,道長列牺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任拗窃,我火速辦了婚禮瞎领,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘随夸。我一直安慰自己九默,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布宾毒。 她就那樣靜靜地躺著驼修,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诈铛。 梳的紋絲不亂的頭發(fā)上乙各,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機與錄音幢竹,去河邊找鬼耳峦。 笑死,一個胖子當(dāng)著我的面吹牛妨退,可吹牛的內(nèi)容都是我干的妇萄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼咬荷,長吁一口氣:“原來是場噩夢啊……” “哼冠句!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起幸乒,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤懦底,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后罕扎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體聚唐,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡丐重,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了杆查。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扮惦。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖亲桦,靈堂內(nèi)的尸體忽然破棺而出崖蜜,到底是詐尸還是另有隱情,我是刑警寧澤客峭,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布豫领,位于F島的核電站,受9級特大地震影響舔琅,放射性物質(zhì)發(fā)生泄漏等恐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一备蚓、第九天 我趴在偏房一處隱蔽的房頂上張望课蔬。 院中可真熱鬧,春花似錦星著、人聲如沸购笆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽同欠。三九已至,卻和暖如春横缔,著一層夾襖步出監(jiān)牢的瞬間铺遂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工茎刚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留襟锐,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓膛锭,卻偏偏與公主長得像粮坞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子初狰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容