Lua垃圾收集


Lua使用自動記憶體管理,該管理使用基於Lua內建的某些演算法的垃圾收集。自動記憶體管理收集,作為開發人員 -

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

Lua使用垃圾收集器它在後台會時不時地執行,收集和銷毀Lua程式存取的死物件。

包括表,使用者資料,函式,執行緒,字串等在內的所有物件都需要進行自動記憶體管理。 Lua使用增量標記和掃描收集器,它使用兩個數位來控制其垃圾收集週期,即垃圾收集器暫停和垃圾收集器步驟倍增器。 這些值以百分比表示,值100通常在內部等於1

垃圾收集器暫停

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

垃圾收集器步驟乘數

此步驟乘數控制垃圾收集器與Lua程式中記憶體分配的相對速度。 較大的步長值將導致垃圾收集器更具侵略性,並且還會增加垃圾收集的每個增量步驟的步長。 小於100的值通常可以避免垃圾收集器不完成迴圈並且通常不是優選的。 預設值為200,這意味著垃圾收集器的執行速度是記憶體分配的兩倍。

垃圾收集器函式

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

  • collectgarbage("collect") -執行一個完整的垃圾收集回圈。
  • collectgarbage("count") - 返回程式當前以千位元組為單位的記憶體量。
  • 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直譯器在稍後階段自動執行。

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