私が取り組んでいる単純なスクリプト言語 API でマーク アンド スイープ ガベージ コレクションを実装しており、ガベージ コレクションのさまざまな実装について読んでいます。Lua などの API は、ホワイト リスト、グレー リスト、ブラック リストでマーク アンド スイープを使用します。
問題は、なぜそのようなリストがあり、なぜこれらの特定の色に入れられるのかについての説明が見つからないように見えることです.
私の現在の些細な実装では、単純に「死んだ」または「生きている」状態を使用しています。スイープでは、死んだオブジェクトが削除されます。私はネイティブ ヒープを使用しているため、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;
}
}