您好,登錄后才能下訂單哦!
這篇文章主要介紹“l(fā)ua gc的使用方法”,在日常操作中,相信很多人在lua gc的使用方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”lua gc的使用方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
主流的垃圾回收一般都是基于引用計數(shù)和標記清除算法.
從內(nèi)存占用量上來講, 引用計數(shù)無疑是有優(yōu)勢的, 當引用計數(shù)為0時, 直接就會將相應的對象清除, 典型的應用就是C++的智能指針. 但是基于引用計數(shù)的gc有一個壞處, 它無法解決循環(huán)引用問題. 如果A引用B會導致B的引用計數(shù)+1, B引用A也會導致A的引用計數(shù)+1, 這樣A,B對象永遠也不會刪除. 記得在OC中似乎使用了弱引用來解決這個問題, 但總感覺這樣會給代碼中埋下坑.
標記清楚算法可以完美的解決循環(huán)引用問題, 其做法是從root遍歷所有可達的指針, 然后將不可達的區(qū)域回收. 這樣即使A和B循環(huán)引用, 只是沒有其他對象來引用A和B, 那么A和B對象即是不可達. 此時A和B對象即可刪除. 但是標記清除算法有一個致命缺陷, 就是在gc時需要停頓整個程序來進行mark-sweep.
最近抽了點時間研究了下go語言, 果然可能是由于太年輕, go也有這個坑. 在搜索資料時發(fā)現(xiàn)很多人都在吐槽go的gc部分, go的主要應用領(lǐng)域就是服務器部分,然而據(jù)說go的gc會造成不可預知的停頓,這對于服務器來講是非常致命的.
看到這, 我突然非常擔心lua也有此問題, 而在silly中也是以lua來寫上層邏輯的, 很擔心lua中的gc是否也會造成stop-the-world. 于是找來手冊重新認真的讀了一下, 發(fā)現(xiàn)以前對于lua的gc的工作方式太想當然了, 以致于造成了對lua的錯誤使用.
lua中的gc算法是采用增量標記清除算法, 通過一次執(zhí)行一小步來將一次完整的gc時間分攤在每一步上, 提高了整個程序的實時性.(具體如何做的,還要等看完源碼才知道:D)
在lua中是分為手動gc和自動gc的.
通過設置垃圾收集器間歇率和垃圾收集器步進倍率來控制自動gc的運行方式.
有某些特殊的條件下, 如果我們需要手動控制gc的時機, 這時就可以LUA_GCSTOP來停止自動垃圾回收器. 然后在恰當?shù)臅r機手動調(diào)用LUA_GCSTEP來發(fā)起一次增量垃圾回收.
這樣看來, 至少在gc的策略上, lua應該做的比go要好. 當然具體情況還是要等看完實現(xiàn)才能更確切的比較.
btw, 作為一門現(xiàn)代語言, gc已經(jīng)是一個不可缺少的部件. 然而gc的問題在于, 在平時開發(fā)時完全體會不到問題, 一旦在大量數(shù)據(jù)面前就有可能會出現(xiàn)各種情況. 因此熟悉一門語言絕不僅僅是熟悉其語法就好了, 還必須要深刻了解該語言的Gc機制, 才能做到心中有數(shù).
到此,關(guān)于“l(fā)ua gc的使用方法”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。