1
延伸閱讀: Precise Garbage Collection for C 有 Linux 核心的 GC 使用案例
Contained two phases, Mark
and Sweep
.
Mark
Phase從 root 開始,找尋 可到達
的物件。 ( Reachable Objects
)
標記 可到達
的物件。
Sweep
Phase從 heap 中,找尋未被標記的物件( Unreachable Objects
),即需要被清除的物件。
將未被標記的物件加入到 free list
中,準備清除。
將已被標記的物件重置為未被標記,以利下次的清掃。
Mark
todo
將所有 root 中的物件加入。todo
中有物件時,執行以下3~4。todo
中選任一物件 v
,將其除外於 todo
。v
未被標記,標記 v
,將所有 v
包含的物件放到 todo
中。Sweep
p
從 heap
的最底層物件開始。p
還不是 top
的時候,執行以下3~5。p
已被標記,則將其改為未標記。p
的記憶體區塊加到 free list
中,準備清除。p
改為在 heap 中上一層的物件。 ( using p <- p + sizeof(p)
)1
todo
) 。todo
)無法預測大小,因此無法預先保留。pointer reversal
,用 depth first search
取代訪問清單。2
parent
位置,就可以不用 pointer reversal
也能執行 depth firsth search
。2
string-separate.c
:
strdup()
:
Cprogramming
LinuxKernel