"매 root 에서 reachable 한 것만 매 mark, 매 unmarked 는 매 sweep". 매 1960 McCarthy 의 LISP 가 매 origin, 매 60+ 년 동안 매 tracing GC 의 backbone. 매 modern 변형 (G1, ZGC, Shenandoah, V8 Orinoco) 매 모두 매 mark-sweep 의 evolution.
매 핵심
매 두 phase
매 Mark: 매 root (stack, register, global) 에서 매 reachable graph 매 traverse, 매 mark bit 설정.
매 Sweep: 매 heap 전체를 매 scan, 매 unmarked block 을 매 free list 로.
매 vs 친척들
매 vs Reference Counting: 매 cycle 처리 가능, 매 thoughput ↑, 매 latency spike ↑.
매 vs Copying (Cheney): 매 fragmentation 발생, 매 메모리 효율 ↑ (매 copy 가 1/2 reserve X).
매 vs Mark-Compact: 매 sweep 후 compact 추가 — 매 fragmentation 해결.
매 Tri-color abstraction
매 White: 매 unvisited (sweep 대상).
매 Grey: 매 reachable, 매 children 미 traverse.
매 Black: 매 reachable + 매 children traversed.
매 invariant: 매 black → white edge 의 X (매 보장 시 concurrent OK).
typedefstructHeap{Obj*objects[MAX];size_tn;Obj*free_list;}Heap;voidsweep(Heap*h){Obj*fl=NULL;for(size_ti=0;i<h->n;i++){Obj*o=h->objects[i];if(!o)continue;if(o->marked){o->marked=0;// 매 reset for next cycle
}else{// 매 free
o->refs[0]=(Obj*)fl;// 매 link to free list
fl=o;h->objects[i]=NULL;}}h->free_list=fl;}
// 매 Dijkstra-style: 매 black 이 white 를 가리키지 않도록
voidwrite_barrier(Obj*parent,size_ti,Obj*child){if(parent->color==BLACK&&child&&child->color==WHITE){child->color=GREY;enqueue(&grey,child);}parent->refs[i]=child;}
Generational hook (write barrier on old → young)
// 매 remembered set 에 매 old object 추가
voidgen_write_barrier(Obj*parent,size_ti,Obj*child){parent->refs[i]=child;if(parent->gen==OLD&&child&&child->gen==YOUNG)remembered_set_add(parent);}