LUA GC 简单测试
LUA GC 簡單測試
function table.count(t)if type(t) ~= "table" thenassert(false)returnendlocal n = 0for k, _ in pairs(t) don = n + 1endreturn n endlocal t = {x1 = "hello",x2 = "world",[1] = "x1111", }print(table.count(t)) t.x1 = nilcollectgarbage()print(table.count(t))?弱引用的GC:LUA和C#一樣,也分值類型:數(shù)值,BOOL;?引用類型:LUA表,線程,協(xié)程,function, userdata。
弱引用最好只用在引用類型上,若用在數(shù)值類型及非構(gòu)造類型,如數(shù)值,字符串等則會出現(xiàn)手動GC不能起作用的現(xiàn)象。
1 weakTable = {} 2 weakTable[1] = function() print("i am the first element") end 3 weakTable[2] = function() print("i am the second element") end 4 weakTable[3] = {1, 2, 3} 5 weakTable[4] = 12 6 weakTable[5] = {1, 2, 32} 7 8 setmetatable(weakTable, {__mode = "v"}) -- 設(shè)置為弱表 9 10 print(table.getn(weakTable)) 11 12 ele = weakTable[1] 13 collectgarbage() 14 print(table.getn(weakTable)) 15 16 ele = nil 17 weakTable[2] = nil 18 weakTable[3] = nil 19 weakTable[4] = nil --若將這句注釋掉,則會發(fā)現(xiàn)GC出問題了:只有weakTable[1]被GC了 20 21 collectgarbage() 22 print(table.getn(weakTable))?
?
弱表(weak table)是一個很有意思的東西,像C++/Java等語言是沒有的。弱表的定義是:A weak table is a table whose elements are weak references,元素為弱引用的表就叫弱表。有弱引用那么也就有強(qiáng)引用,有引用那么也就有非引用。我們先要厘這些基本概念:變量、值、類型、對象。
(1)變量與值:Lua是一個dynamically typed language,也就是說在Lua中,變量沒有類型,它可以是任何東西,而值有類型,所以Lua中沒有變量類型定義這種東西。另外,Lua中所有的值都是第一類值(first-class values)。
(2)Lua有8種基本類型:nil、boolean、number、string、function、userdata、thread、table。其中Nil就是nil變量的類型,nil的主要用途就是一個所有類型之外的類型,用于區(qū)別其他7中基本類型。
(3)對象objects:Tables、functins、threads、userdata。對于這幾種值類型,其變量皆為引用類型(變量本身不存儲類型數(shù)據(jù),而是指向它們)。賦值、參數(shù)傳遞、函數(shù)返回等都操作的是這些值的引用,并不產(chǎn)生任何copy行為。
?
Lua的垃圾回收機(jī)制:gc是很多語言的常見機(jī)制,讓程序員拜托復(fù)雜易出錯的內(nèi)存管理。
定義:Lua manages memory automatically by running a?garbage collector?to collect all?dead objects?(that is, objects that are no longer accessible from Lua).?
三點理解:(1)gc自動運(yùn)行,也可以手動調(diào)用;(2)自動收集的目標(biāo)是引用計數(shù)為0的對象;(3)dead objects:不能訪問到的對象,沒有引用指向它了,當(dāng)然就是訪問不到的了,也就等同于垃圾內(nèi)存了。
?
weak table的定義:
(1)weak表是一個表,它擁有metatable,并且metatable定義了__mode字段;
(2)weak表中的引用是弱引用(weak reference),弱引用不會導(dǎo)致對象的引用計數(shù)變化。換言之,如果一個對象只有弱引用指向它,那么gc會自動回收該對象的內(nèi)存。
(3)__mode字段可以取以下三個值:k、v、kv。k表示table.key是weak的,也就是table的keys能夠被自動gc;v表示table.value是weak的,也就是table的values能被自動gc;kv就是二者的組合。任何情況下,只要key和value中的一個被gc,那么這個key-value pair就被從表中移除了(?In any case, if either the key or the value is collected, the whole pair is removed from the table)。
posted on 2016-10-27 12:52 時空觀察者9號 閱讀(...) 評論(...) 編輯 收藏
總結(jié)
以上是生活随笔為你收集整理的LUA GC 简单测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。