Lua - 垃圾回收



Lua 使用基於某些內建演算法的垃圾回收進行自動記憶體管理。由於自動記憶體管理,作為開發人員:

  • 無需擔心為物件分配記憶體。
  • 無需在不再需要時釋放它們,除非將其設定為 nil。

Lua 使用垃圾收集器,該收集器會不時執行以收集不再可從 Lua 程式訪問的死物件。

所有物件(包括表、使用者資料、函式、執行緒、字串等)都受自動記憶體管理。Lua 使用增量標記和清除收集器,該收集器使用兩個數字來控制其垃圾收集週期,即 **垃圾收集器暫停** 和 **垃圾收集器步長乘數**。這些值以百分比表示,值 100 通常在內部等於 1。

垃圾收集器暫停

垃圾收集器暫停用於控制垃圾收集器在 Lua 的自動記憶體管理再次呼叫它之前需要等待多長時間。小於 100 的值意味著 Lua 不會等待下一個週期。同樣,此值的較高值會導致垃圾收集器變慢且不那麼積極。值為 200 表示收集器等待使用中的總記憶體加倍後再開始新週期。因此,根據應用程式的性質和速度,可能需要更改此值以獲得 Lua 應用程式的最佳效能。

垃圾收集器步長乘數

此步長乘數控制 Lua 程式中垃圾收集器相對於記憶體分配的速度。較大的步長值會導致垃圾收集器更積極,並且還會增加垃圾收集每個增量步驟的步長。小於 100 的值通常會導致垃圾收集器無法完成其週期,通常不建議這樣做。預設值為 200,這意味著垃圾收集器的執行速度是記憶體分配速度的兩倍。

垃圾收集器函式

作為開發人員,我們確實可以控制 Lua 中的自動記憶體管理。為此,我們有以下方法。

  • collectgarbage("collect") − 執行一個完整的垃圾收集週期。

  • collectgarbage("count") − 返回程式當前使用的記憶體量(以 KB 為單位)。

  • collectgarbage("restart") − 如果垃圾收集器已停止,則重新啟動它。

  • collectgarbage("setpause") − 將作為第二個引數給出的值除以 100 設定為垃圾收集器暫停變數。其用途如上所述。

  • collectgarbage("setstepmul") − 將作為第二個引數給出的值除以 100 設定為垃圾步長乘數變數。其用途如上所述。

  • collectgarbage("step") − 執行一步垃圾收集。第二個引數越大,此步驟就越大。如果觸發的步驟是垃圾收集週期的最後一步,則 collectgarbage 將返回 true。

  • collectgarbage("stop") − 停止正在執行的垃圾收集器。

示例 - 執行垃圾收集器

下面顯示了一個使用垃圾收集器示例的簡單示例。

mytable = {"apple", "orange", "banana"}

print(collectgarbage("count"))

mytable = nil

print(collectgarbage("count"))

print(collectgarbage("collect"))

print(collectgarbage("count"))

執行上述程式時,我們將得到以下輸出。請注意,此結果將因作業系統的型別以及 Lua 的自動記憶體管理功能的不同而有所不同。

23.1455078125   149
23.2880859375   295
0
22.37109375     380

您可以在上述程式中看到,一旦完成垃圾收集,它就會減少使用的記憶體。但是,呼叫它不是強制性的。即使我們不呼叫它們,Lua 直譯器也會在預定義時間段後自動在稍後階段執行它們。

示例 - 步進/停止垃圾收集器

下面顯示了一個使用垃圾收集器示例的簡單示例。

mytable = {"apple", "orange", "banana"}

print(collectgarbage("count"))

mytable = nil

print(collectgarbage("count"))

print(collectgarbage("step"))

print(collectgarbage("stop"))

執行上述程式時,我們將得到以下輸出。請注意,此結果將因作業系統的型別以及 Lua 的自動記憶體管理功能的不同而有所不同。

21.0029296875
21.0322265625
false
0

顯然,如果需要,我們可以使用這些函式更改垃圾收集器的行為。這些函式為開發人員提供了更多功能來處理複雜的情況。根據程式的記憶體需求型別,您可以使用或不使用此功能。但是,瞭解應用程式中的記憶體使用情況並在程式設計過程中檢查它以避免部署後出現意外結果非常有用。

廣告
© . All rights reserved.