"매 reference store 의 inline 직전 추가 코드, 매 GC가 매 inter-generational pointer 또는 concurrent invariant 를 track 하기 위함". 매 generational / incremental / concurrent GC의 핵심 mechanism으로, 2026 modern runtime (HotSpot ZGC, OpenJDK G1, .NET, V8 Orinoco, Go) 모두 형태가 다른 write barrier를 사용.
매 핵심
매 왜 필요
Generational GC: old → young pointer 의 매 빠른 식별 (remembered set).
Concurrent GC: mutator + collector 동시 동작 시 invariant 유지 (SATB, Incremental Update).
매 every reference store 마다 매 hooked code path.
매 종류
Card-marking (G1, .NET): heap을 card (~512B) 로 분할, store 시 card byte를 dirty.
Snapshot-At-The-Beginning (SATB) (G1, ZGC): 매 overwrite 직전 old value를 mark queue에.
Incremental Update (CMS): 매 store 의 new value를 mark queue에.
Read barrier (ZGC, Shenandoah): 매 load 시점 hook (대조).
매 응용
매 generational collector의 minor GC가 old gen scan 안 해도 됨.
매 concurrent marking의 lost-edge 방지.
매 region-based collector의 inter-region reference 추적.
💻 패턴
Card-marking (pseudo C)
// every "obj.field = val"
voidstore_ref(Object*obj,intidx,Object*val){obj->fields[idx]=val;// 매 barrier
uintptr_tcard=((uintptr_t)obj)>>9;// 512B
card_table[card]=DIRTY;}