簡單講解Lua中的垃圾回收機(jī)制
Lua使用基于被內(nèi)置在Lua某些算法的垃圾收集自動(dòng)內(nèi)存管理??梢宰詣?dòng)內(nèi)存管理的結(jié)果,作為一個(gè)開發(fā)者:
- 沒有必要擔(dān)心的對象分配內(nèi)存。
- 無需釋放他們時(shí),不再需要可將其設(shè)置為nil。
Lua使用運(yùn)行不時(shí)收集死的對象時(shí),不再從Lua程序中訪問垃圾收集器。
所有對象,包括表,用戶數(shù)據(jù),函數(shù),線程,字符串等受自動(dòng)內(nèi)存管理。 Lua使用增量標(biāo)記和使用兩個(gè)數(shù)字來控制其垃圾回收周期即垃圾收集暫停和垃圾收集器的步驟事半功倍清除收集器。這些值是在百分比和100的值是常等于1。
垃圾收集暫停
垃圾收集停頓被用于控制多長時(shí)間的垃圾收集器需要等待,之前;它是由Lua的自動(dòng)內(nèi)存管理再次調(diào)用。數(shù)值低于100就意味著Lua中不會(huì)等待下一個(gè)周期。此值的類似地較高的值將導(dǎo)致垃圾收集器是緩慢的并且性質(zhì)上較不積極。200表示該集合等待的總內(nèi)存在使用中要開始一個(gè)新的周期開始前的兩倍。因此,根據(jù)不同的性質(zhì)和應(yīng)用的速度,有可能要求改變該值來獲得在Lua應(yīng)用的最佳性能。
垃圾收集器的步驟事半功倍
這一步乘數(shù)控制垃圾收集在Lua程序的內(nèi)存分配的相對速度。較大的步長值將導(dǎo)致垃圾收集器要更侵蝕性,同時(shí)也提高了垃圾收集的每個(gè)增量步的步長大小。值小于100可能經(jīng)常導(dǎo)致避免垃圾收集器沒有完成其周期和其一般不是優(yōu)選的。默認(rèn)值是200,這意味著垃圾收集器運(yùn)行的兩倍的內(nèi)存分配的速度。
垃圾收集器函數(shù)
作為開發(fā)人員,我們確實(shí)有過讓Lua自動(dòng)內(nèi)存管理。為此,有以下幾種方法。
- collectgarbage("collect"): 執(zhí)行垃圾回收的一個(gè)完整周期。
- collectgarbage("count"): 返回當(dāng)前使用的千字節(jié)的程序內(nèi)存量
- collectgarbage("restart"): 如果垃圾收集器已經(jīng)停止,將重新啟動(dòng)它。
- collectgarbage("setpause"): 設(shè)置給定為第二參數(shù)除以100至垃圾收集器暫停變量的值。它的用途是作為討論的一點(diǎn)上面。
- collectgarbage("setstepmul"): 設(shè)置給定為第二參數(shù)除以100到垃圾步驟乘數(shù)的變量的值。它的用途是作為討論的一點(diǎn)上面。
- collectgarbage("step"): 運(yùn)行垃圾回收的一步。第二個(gè)參數(shù)是越大step也會(huì)變大。在收集的垃圾將返回true,如果觸發(fā)的步驟是一個(gè)垃圾收集周期的最后一步。
- collectgarbage("stop"): 停止垃圾收集器,如果它的運(yùn)行。
使用垃圾收集器例如一個(gè)簡單的例子如下所示。
print(collectgarbage("count"))
mytable = nil
print(collectgarbage("count"))
print(collectgarbage("collect"))
print(collectgarbage("count"))
當(dāng)我們運(yùn)行上面的程序,會(huì)得到下面的輸出。請注意,這樣的結(jié)果會(huì)有所不同,由于在操作系統(tǒng)中,Lua自動(dòng)內(nèi)存管理功能可能也有差異。
20.9853515625
0
19.4111328125
可以在上面的程序看出,一旦垃圾回收完成后,既可以減少使用內(nèi)存。但是它也不是強(qiáng)制性的調(diào)用。即使我們不給調(diào)用,它也會(huì)自動(dòng)在后一階段在預(yù)定時(shí)間之后由Lua解釋器執(zhí)行。
顯然我們可以改變,如果需要使用垃圾收集器的這些功能行為。這些功能提供了一點(diǎn)額外的能力,為開發(fā)者處理復(fù)雜情況。根據(jù)不同的內(nèi)存需要執(zhí)行程序類型,可能會(huì)或可能不會(huì)使用此功能。但在應(yīng)用程序的內(nèi)存使用情況,并在程序本身,以避免在部署后不想要對結(jié)果進(jìn)行檢查。
相關(guān)文章
Lua學(xué)習(xí)筆記之?dāng)?shù)據(jù)類型
這篇文章主要介紹了Lua學(xué)習(xí)筆記之?dāng)?shù)據(jù)類型,本文同時(shí)講解了開發(fā)環(huán)境的搭建,需要的朋友可以參考下2014-09-09Lua教程(五):C/C++操作Lua數(shù)組和字符串示例
這篇文章主要介紹了Lua教程(五):C/C++操作Lua數(shù)組和字符串示例,本文同時(shí)還講解了如何在C/C++函數(shù)里面存儲(chǔ)Lua狀態(tài),需要的朋友可以參考下2014-09-09詳解Lua中的變量相關(guān)知識(shí)點(diǎn)
這篇文章主要介紹了Lua中的變量相關(guān)知識(shí)點(diǎn),是Lua入門中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05