Lua模組的載入與記憶體釋放

2022-03-19 15:02:01 字數 1353 閱讀 2484

今天早上聽說一件事情讓我覺得很詭異的事情:公司線上的一款遊戲,載入乙份配置資源後,記憶體漲了幾十m,然後記憶體再也下不來了。因為好奇,所以要來了最大的乙個配置檔案(4.5m,去除空格與換行後的大小),進行測試。最終發現,記憶體其實是可以被釋放的,不過需要注意以下的規則。

同時,為了證明luac 與 luajit 表現一致,我同時也使用了 luajit 進行了測試。

在開始選單中找到 visual studio的 command prompts

重點在模組的編寫,模組編寫的方法導致了釋放記憶體的不同。

當 require 準備載入乙個 lua 檔案時,它會先檢測 package.loaded[modulename] 是否返回 false,如果不是 false,它直接返回相應儲存的值,否則查詢並載入相應的檔案,找不到就報錯。

當載入的乙個 lua 模組,如果沒有 return 任何值時,package.loaded[modulename] 值為 true。

當載入乙個 lua 模組,返回乙個 table 時,package.loaded[modulename] 值為 table。

我拿到的 lua 檔案是這樣定義的,原本是乙個json,將其轉為lua的,將所有資料賦值給乙個變數(require 之後多了乙個全域性變數),這樣 package.loaded[modulename] 為 true,重置這個值並不會**記憶體,需要同時清理全域性變數(將相應變數置為 nil),才可以實現記憶體的**。

示例**:

local a = require(「b」)

-- clear

a = nil

package.loaded[「b」] = nil

collectgarbage()

print(collectgarbage("count") / 1024)

可以針對上面的函式,封裝乙個unrequire

function unrequire(m)

package.loaded[m] =nil

_g[m] =nil

end

實際測試的示例

上面的20.xx是m,你沒看錯。乙個約4.5m的 lua 檔案,被 require 進記憶體後,lua 所占用的記憶體大小變為 20m。為什麼會這麼大,有待進一步從原始碼中尋找答案。

Lua模組的載入與記憶體釋放

今天早上聽說一件事情讓我覺得很詭異的事情 公司線上的一款遊戲,載入乙份配置資源後,記憶體漲了幾十m,然後記憶體再也下不來了。因為好奇,所以要來了最大的乙個配置檔案 4.5m,去除空格與換行後的大小 進行測試。最終發現,記憶體其實是可以被釋放的,不過需要注意以下的規則。同時,為了證明luac 與 lu...

lua模組載入

module mod name,package.seeall 函式 通過package.seeall選項可令舊全域性環境可見。require mod name 載入指定的模組。先檢測package.loaded表中是否存在modname,存在則直接返回當中的值,沒有則通重載入器載入modname。p...

lua的模組載入require

載入指定的模組。首先函式會在 package.loaded 這個表中檢視是否已經載入 了 modname 這個模組。如果是,那麼 require 會返回儲存在 package.loaded modname 的值。否則它將嘗 試去查詢乙個載入該模組的載入器。require 是由 package.sea...