lua 中的內存管理: garbage collection


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) 強迫進行垃圾收集。在這之后,一個新值根據先前的規則被設置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM