我正在使用簡單的腳本語言API實現標記和清理垃圾收集,我正在研究垃圾收集的各種實現。 API(如Lua)使用白色,灰色和黑色列表進行標記和掃描。爲什麼GC中的白色/灰色/黑色?
的問題是,我似乎無法找到爲什麼有這樣的列表,爲什麼他們投入這些特定顏色的解釋。
在我目前的,簡單的實現,我簡單地用「死」或「活着」的狀態。在掃描中,死對象被刪除。我正在使用本地堆,所以我沒有在GC中做任何動作。
我在C.
寫它// Performs a full garbage collection
void GorCollect(GorContext *ctx)
{
Value *v, *end;
Collectable *c, *n;
// mark stack references
end = ctx->stack + ctx->stackTop + 1;
v = ctx->stack;
while(v != end)
{
if (gvisgc(v) && v->v.gc) // mark if a collectable obj
Mark(v->v.gc);
v = v++;
}
// mark global references
if (ctx->global)
Mark((Collectable *)ctx->global); // ctx->global is a collectable obj
// perform sweep
c = ctx->gchead; // full list of collectable objs
ctx->gchead = 0;
while(c) {
n = c->next;
// destroy unmarked collectable
if (!c->marked)
FreeCollectable(ctx, c);
// rebuild gc list (singly-linked)
else
{
c->marked = 0;
if (!ctx->gchead)
c->next = 0;
else
c->next = ctx->gchead;
ctx->gchead = c;
}
c = n;
}
}
'爲什麼他們被放入這些特定的顏色 - 因爲它們很漂亮! – asaelr 2012-02-14 23:27:09
搜索「標記並掃描白色灰黑色」使我轉向:http://www.memorymanagement.org/glossary/t.html#tri-color.marking。該頁面提到了算法的一個重要屬性是「正確的」,所以我的猜測是,天真的方法有一些邊緣案例,它打破了。 – millimoose 2012-02-14 23:30:42
另外:http://en.wikipedia.org/wiki/Mark_and_sweep#Naive_mark-and-sweep列表作爲天真的方法的主要缺點在於它不能而不暫停該過程來執行。 – millimoose 2012-02-14 23:32:29