天天看點

Lua遊戲記憶體洩漏檢查

上一篇我們對Lua對象釋放做了一些初步了解,那麼在這一節中,我就簡單介紹兩種Lua記憶體洩漏檢查的常用方法。

  1. 記憶體快照

    對于記憶體快照,目前用得最多的是雲風大大開源在github上的snapshot庫。原文連結

    它提供一個函數,可以對目前的 Lua State 做一個完整的快照,為了減少分析資料,隻記錄了複雜對象的引用關系。也就是記錄記錄下所有 table thread userdata function 間的引用。

    我們可以在不同時間,對 Lua State 拍兩個快照,相比較後,就很容易知道新增加的記憶體處于何處。
  2. _G表周遊

    方案一、從_G開始周遊整個Lua節點,包括table,metatable,和函數的upvalue的引用的統計個數,在引用計數找出異常的節點。

    方案二、從_G開始周遊整個Lua節點,記錄整個節點樹,在不同時間比較檢查新增的節點。

    當然,_G表周遊也存在不少坑,例如單例,引用變量等都可能引起死循環,這個得注意。

在排查過程中,我們也應該懂得過濾一些幹擾項。比如下面幾種類型是引用類型,并不是值類型,是以往往指派操作後,記憶體快照也會把這些比對出來。

Tables、functins、threads、userdata。對于這幾種值類型,其變量皆為引用類型(變量本身不存儲類型資料,而是指向它們)。指派、參數傳遞、函數傳回等都操作的是這些值的引用,并不産生任何copy行為。

繼續閱讀