Lua內存管理策略

傳統的內存管理策略主要分為兩種:引用計數,和垃圾回收。相比后者每一段時間執行一次回收周期,前者是對于每一個變量都維護被引用數的策略。對于Lua這種輕量化語言而言,占據大內存的開銷是極力避免的,而前者的方式顯然是增加內存開銷的壞主意。因此Lua采取了垃圾回收的機制,這也是本篇文章的主題。

垃圾收集原理

分為兩個階段:標記-清除階段。

標記階段

從根集(全局變量,當前訪問的局部變量等等)開始,依次向內部遞歸標記活動對象。

清除階段

掃描所有對象,沒有被標記的對象都被認為是不再被引用的對象,可以釋放內存。

垃圾收集策略

目前Lua有兩種策略:增量式GC和分代式GC。Lua默認收集策略是前者。

增量式GC

此模式下,每個GC循環都會和主程序交錯運行,并不會在一段時間內完成所有的GC步驟。在此模式下的總GC時間是不會變的,但是相比于之前那種完整的一段時間的卡頓,是要優化不少的。

引入三個參數:收集器頻率、收集器步進乘數、收集器步進。

第一個參數意指內存使用量達到上次垃圾收集后的內存的n%時執行收集操作。默認為200,即達到上次收集的內存兩倍時開始新循環,小于100意味著直接執行收集操作,最大為1000。

第二個參數意指標記/掃描元素的速度。默認值是100,最大值是1000。值越大標記速度越快,但需要的分配內存也會越大。

第三個參數意指執行標記步驟之前分配多少內存。此數字n指的是2^n字節。較大的值可能會使增量式GC轉變成早前版本的非增量式GC。

使用的是三色標記法來實現增量式GC。

如圖所示,分為三個色系。

黑色為被標記且已經被完全檢查引用的對象。

灰色為被標記但是還沒有被完全檢查引用的對象。

白色是暫時還沒有被標記的對象。

我們從根系開始尋找對象,直到不再有灰色對象存在為止(因為灰色對象最終都會轉成黑色)。最終所有白色對象都應當被回收。

增量GC過程中或許會有新的引用關系,因此需要考慮以下兩個問題:

1.已經被標為黑色的對象和白色的對象之間建立了新的聯系怎么辦

2.被標為灰色的對象和之前引用它的黑色對象之間斷開聯系了怎么辦

對于第一個問題,可以通過增量更新的方式解決:插入引用關系的時候,將黑色對象記錄下來,等到標記過程完全結束后,重新掃描這類黑色對象,那些被標記為白色的對象重新成為灰色對象并再次執行以上檢查引用操作。

對于第二個問題,可以通過原始快照的方式解決,也和上面方法類似,記錄下來變動的黑色對象,標記過程結束后重新掃描。當然也可以選擇不理睬,因為這類灰色對象引用斷開后會在下一次GC過程中成為白色對象,依然會被清除。

分代式GC

此模式下,收集器會頻繁進行次要收集,僅遍歷最近創建的對象;次要收集后仍高于內存限制,則進行主要收集,遍歷所有對象。

引入兩個參數:次要收集頻率,主要收集頻率。

這兩個參數都意指在內存使用量超過上次收集后的內存的n%時(注意是超過,增量式GC的頻率值是達到)實行收集策略。前者是超過n%時開始次要收集,默認值是20,最大值是200;后者是超過n%時開始主要收集,默認值是100,最大值是1000。

分為兩種對象:新生代和老年代。其根據對象創建時機判斷(即經歷了多少次垃圾收集)。次要收集主要收集這些新生代,原因在于許多新創建的對象很快就不會再被需要了,而老年代通常會繼續存活下來。

分代式GC的優點在于減少暫停時間,收集效率變高,但同時也因為其復雜性和優先級,會容易使老年代可能占據內存的較長時間。

輔助垃圾收集

有時候Lua并不清楚哪些是我們所認為的垃圾,所以需要我們自身做輔助工作保證Lua完成釋放內存的任務。

析構器

一個對象被回收時,如果其有__gc元方法,則會調用此方法。注意,官方文檔中強調,執行這段元方法時會短暫地復活這個對象,原因是元方法內部可能會有對象自身的調用。但是這是暫時的,如果此元方法沒有改變對象的引用信息(比如這個對象被全局變量引用),那么下一次GC依然會把這個對象給收集掉。還有一點值得注意:如果gc內部又賦值了一次gc元方法,則會在下一次gc時又調用一次gc元方法,參考以下代碼:

t = {name = "zhangsan"}
setmetatable(t,{__gc = function (t)print(t.name)t.name = "lisi"setmetatable(t,{__gc = function (t)print(t.name)end})
end})--用一個weak表管理
local cacheTable = {}
setmetatable(cacheTable,{__mode = 'v'
})
table.insert(cacheTable,t)t = nilprint(cacheTable[1]) --table: 000001F3334CAD40
collectgarbage() --zhangsan
print(cacheTable[1]) --nil
collectgarbage() --lisi

Weak表

參考之前的博客:Lua weak表-CSDN博客

collectgarbage函數

顯式調用函數以使得Lua直接執行回收相關的操作。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696656.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696656.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696656.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

singularity build用法詳解,及實例

singularity build 命令是 Singularity 中非常重要的一個功能,它允許用戶從定義文件、現有的 Singularity 容器或者其他容器平臺(如 Docker)的鏡像來構建一個新的 Singularity 容器。這個命令主要用于創建定制化的容器環境,以適應特定的應用和需求。 命令格式 singularit…

JDBC的DBUtil 和 xxxDAO 示例

DBUtil package common;import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;public class DBUtil {// 需要封裝…

C語言運用中斷子系統用驅動控制led實驗,c語言串口led點燈實驗(驅動+應用層)

中斷子系統用驅動控制led實驗 驅動代碼 #include <linux/init.h> #include <linux/module.h>#include<linux/interrupt.h> #include<linux/gpio.h> #include<linux/timer.h>#include<linux/of.h> #include<linux/of_irq.h> #inclu…

GB/T 17640-2023 長絲機織土工布檢測

長絲機織土工布是指以合成纖維長絲為原料織制而成的土工布&#xff0c;按纖維品種分為滌綸、丙綸、錦綸 等長絲機織土工布&#xff1b;按用途分為反濾布、復合用基布、管袋布、模袋布等。 GB/T 17640-2023 長絲機織土工布測試項目&#xff1a; 測試要求 測試標準 經向抗拉強…

實現律所高質量發展-Alpha法律智能操作系統

律師行業本質上屬于服務行業&#xff0c;而律師團隊作為一個獨立的服務單位&#xff0c;應當包含研發、市場、銷售、服務等單位發展的基礎工作環節。但現實中&#xff0c;很多律師團隊其實并沒有區分這些工作。鑒于此&#xff0c;上海市錦天城律師事務所醫藥大健康行業資本市場…

【備忘】幾個特殊的注冊表路徑

記錄幾個有用的注冊表路徑。防止用到忘記了。&#xff08;非教程篇&#xff09; 計算機\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PolicyManager\default\Start 計算機\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PolicyManager\default\WindowsLogon\HideFastUserSwitching 虛擬桌…

【SQL注入】靶場SQLI DUMB SERIES-26空格和注釋被過濾

26題提示所有的空格和注釋都會被過濾掉 輸入?id0判斷閉合方式&#xff0c;回顯報錯可以確定閉合方式為單引號 正常思路是需要通過注釋符將后面的語句注釋掉&#xff0c;但是這一關的注釋符被過濾了&#xff0c;可以考慮使用將后面的語句也閉合的思路來避免引號帶來的報錯。輸…

【區塊鏈技術——智能合約——以太坊平臺——金融交易】

引言 在如今這個高度數字化的世界中&#xff0c;金融交易趨向于使用更加先進的技術來減少交易成本&#xff0c;提高效率。區塊鏈技術的出現作為一場革命&#xff0c;尤其是其衍生技術——智能合約&#xff0c;為金融交易帶來諸多新機遇。本文將以最廣泛使用的區塊鏈平臺——以…

【leetcode】記憶化搜索

記憶化搜索 一、斐波那契數1、題目描述2、代碼3、解析 二、不同路徑1、題目描述2、代碼3、解析 三、最長遞增子序列1、題目描述2、代碼3、解析 四、猜數字大小II1、題目描述2、代碼3、解析 五、矩陣中的最長遞增路徑1、題目描述2、代碼3、解析 一、斐波那契數 1、題目描述 le…

【java】小學生數學練習題目生成系統

本文章主要是CSDN-問答板塊&#xff0c;有題主提出的問題&#xff0c;我這邊將完整代碼提供出來&#xff0c;僅供大家參考學習&#xff01; 一、效果截圖 二、直接上代碼 package com.example.dingtalk.question;import javax.script.ScriptEngine; import javax.script.Scrip…

PHP實踐:Laravel中事件使用講解

&#x1f3c6;作者簡介&#xff0c;黑夜開發者&#xff0c;CSDN領軍人物&#xff0c;全棧領域優質創作者?&#xff0c;CSDN博客專家&#xff0c;阿里云社區專家博主&#xff0c;2023年6月CSDN上海賽道top4。 &#x1f3c6;數年電商行業從業經驗&#xff0c;歷任核心研發工程師…

kafka生產者

1.原理 2.普通異步發送 引入pom&#xff1a; <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.0.0</version></dependency><dependency><g…

“errcode“:40163,“errmsg“:“code been used

{"errcode":40163,"errmsg":"code been used, rid: 65d6fa01-6ae8fecc-3a2f4bf8"} 通過微信靜默授權方式&#xff0c;獲得當前微信用戶 openid 時&#xff0c;重復使用 code 造成的。 不是騰訊的問題&#xff0c;自己的代碼邏輯沒有遵循騰訊請…

2024022202-查詢優化

查詢優化 概述 關系系統和關系模型是兩個密切相關而有不同的概念。支持關系模型的數據庫管理系統稱為關系系統。但是關系模型中并非每一部分都是同等重要的&#xff0c;所以我們不苛求完全支持關系模型的系統才能稱為關系系統。因此&#xff0c;我們給出一個關系系統的最小要求…

excel數據處理——一列數據轉換為n列多行

按行抽取 如果只希望保留第一行的標題&#xff0c;然后將其他奇數行刪除&#xff0c;可以選擇一個空白列&#xff0c;為不同的行賦值&#xff0c;函數為“mod(row(),2)”&#xff1b; 這個是0,1 數列&#xff0c;如果是0,1&#xff0c;2就是“mod(row(),3)”。 行列轉換 復制…

【學習總結】慢SQL治理經驗總結

一、慢SQL定義 執行超過1s的SQL為慢SQL 三、慢SQl的風險 系統的響應時間延遲&#xff0c;影響用戶體驗 資源占用增加&#xff0c;增高了系統的負載&#xff0c;其他請求響應時間也可能會收到影響。 慢SQL占用數據庫連接的時間長,如果有大量慢SQL查詢同時執行&#xff0c;可能…

Waline評論服務端轉移至Deta

舊文首發地址 問題 前陣子評論系統又掛了&#xff0c;原因是*.vercel.app域名被污染。 解決方法 法一&#xff1a;服務端換個域名 法二&#xff1a;換個服務端部署 我選法二。 步驟 DETA官網&#xff1a;https://www.deta.sh/ Deta is free for ever. 這句話很不錯有木有…

C語言中的assert.h:調試助手與斷言詳解

在C語言編程中&#xff0c;assert.h頭文件提供了非常有用的斷言&#xff08;Assertion&#xff09;功能&#xff0c;它主要用于開發和調試階段&#xff0c;確保程序在運行時滿足某些預期條件。如果這些條件未得到滿足&#xff0c;則程序會立即停止執行&#xff0c;并打印出有關…

【MySQL】解決在join表時一對多的情況下重復數據的問題

在MySQL中進行JOIN操作&#xff0c;特別是在處理一對多關系的表時&#xff0c;可能會出現重復的記錄&#xff0c;這是因為左表&#xff08;或右表&#xff09;中的每一項在與右表&#xff08;或左表&#xff09;連接時&#xff0c;如果對應有多條匹配記錄&#xff0c;則會生成多…

冷鏈物流追蹤:Java與MySQL的協同實踐

??計算機編程指導師 ??個人介紹&#xff1a;自己非常喜歡研究技術問題&#xff01;專業做Java、Python、微信小程序、安卓、大數據、爬蟲、Golang、大屏等實戰項目。 ??實戰項目&#xff1a;有源碼或者技術上的問題歡迎在評論區一起討論交流&#xff01; ?? Java實戰 |…