0 引言
lua的垃圾回收機制: collectgarbage([opt[,arg]]) 用來控制自動內存管理
- collectgarbage("collect"): 做一次完整的垃圾收集循環。通過參數 opt 它提供了一組不同的功能:
- collectgarbage("count"): 以 K 字節數為單位返回 Lua 使用的總內存數。 這個值有小數部分,所以只需要乘上 1024 就能得到 Lua 使用的准確字節數(除非溢出)。
- collectgarbage("restart"): 重啟垃圾收集器的自動運行。
- collectgarbage("setpause"): 將 arg 設為收集器的 間歇率。 返回 間歇率 的前一個值。
- collectgarbage("setstepmul"): 返回 步進倍率 的前一個值。
- collectgarbage("step"): 單步運行垃圾收集器。 步長"大小"由 arg 控制。 傳入 0 時,收集器步進(不可分割的)一步。 傳入非 0 值, 收集器收集相當於 Lua 分配這些多(K 字節)內存的工作。 如果收集器結束一個循環將返回 true 。
- collectgarbage("stop"): 停止垃圾收集器的運行。 在調用重啟前,收集器只會因顯式的調用運行。
(1)gc自動運行,也可以手動調用;
(2)自動收集的目標是引用計數為0的對象;
(3)dead objects:不能訪問到的對象,沒有引用指向它了,當然就是訪問不到的了,也就等同於垃圾內存了。
1 fulluserdata VS lightuserdata
class A {
public:
A();
~A();
}
static int A(lua_State *L) { }
2 gc
Lua使用兩個數字控制垃圾收集循環。一個數字表示Lua使用的動態內存的字節數,另一個是閥值。(見 2.9)。一個數字表示Lua使用的動態內存的字節數,另一個是閥值。當內存字節數到達閥值時,Lua就運行垃圾收集器,來釋放死對象的空間。一旦字節計數器被調整,那么閥值就會被設為字節計數器新值的兩倍。
你可以通過以下的函數得到這兩個量的當前值:
int lua_getgccount (lua_State *L); int lua_getgcthreshold (lua_State *L);
它們的返回值的單位都是千字節(K bytes)。你可以通過下面的函數改變閥值
void lua_setgcthreshold (lua_State *L, int newthreshold);
然后,新的閥值得單位也是千字節。當你調用這個函數,Lua設置閥新值並且和字節計數器作比較。如果新的閥值小於字節計數器,Lua將立刻運行垃圾收集器。特別是 lua_setgcthreshold(L,0)
強迫進行垃圾收集。在這之后,一個新值根據先前的規則被設置。