1 GC狀態(tài)
/*
** Possible states of the Garbage Collector
*/
#define GCSpropagate 0
#define GCSatomic 1
#define GCSswpallgc 2
#define GCSswpfinobj 3
#define GCSswptobefnz 4
#define GCSswpend 5
#define GCScallfin 6
#define GCSpause 7
/*
** internal state for collector while inside the atomic phase. The
** collector should never be in this state while running regular code.
*/
#define GCSinsideatomic (GCSpause + 1)
GC周期一般會有0至7這八個狀態(tài),另外還有一個中間態(tài)GCSinsideatomic是在atomic階段執(zhí)行過程出現(xiàn)的,所以嚴格來說有九個狀態(tài)辟宗。
- GCSpause 表示GC暫停狀態(tài)纳鼎,目的是等待內(nèi)存新增到某個閾值(默認是當前內(nèi)存的2倍)耐朴。
消除弱表中的循環(huán)(Eliminating Cycles in Weak Tables)
從以上鏈接譯文,lua作者對垃圾回收算法的總結(jié)是:
gc.png
引用原文描述
在三色標記算法中抗蠢,回收器可以被描述為一個過程薛躬,這個過程跟蹤對象并為它們著色。在開始僧界,所有的對象都是白色侨嘀。當回收器跟蹤引用圖時,它會給每個它經(jīng)過的對象著為黑色捂襟。在回收的末尾咬腕,所有可以被訪問的對象一定是黑色,并且所有白色對象將會被刪除葬荷。但是涨共,由于垃圾回收器與程序是交替運行的,因此我們需要考慮中間狀態(tài)闯狱。此外煞赢,程序不允許改變引用圖,否則回收器將不能找到所有可達對象哄孤。為了解決這一問題照筑,三色標記算法使用了第三種顏色中的灰色來表示,對象可達但是它們的子節(jié)點還沒有被跟蹤。這意味著凝危,當一個對象正在被跟蹤過程中(tracing),它就會被著為灰色波俄。當所有的子節(jié)點都被跟蹤后,這個對象將會被著為黑色蛾默。直觀上懦铺,跟蹤中(tracing)就像是掀起了一個灰色對象的波浪,把白色(不可達)對象和黑色對象分開了支鸡,前提是冬念,黑色對象永遠不會引用白色對象。然而程序可能仍然會從黑色對象上創(chuàng)建一個指向白色對象的指針牧挣,這違反了那個前提急前。為了防止這種情況,回收器使用write barrier :當程序試圖將一個白色對象的引用寫入黑色對象中瀑构,不管原來是黑色還是白色裆针,都將會變成灰色。
-- 待續(xù)