Files
2nd/10_Wiki/Topics/Architecture/Write_Barrier.md
T
2026-05-10 22:08:15 +09:00

4.1 KiB

id, title, category, status, canonical_id, aliases, duplicate_of, source_trust_level, confidence_score, verification_status, tags, raw_sources, last_reinforced, github_commit, tech_stack
id title category status canonical_id aliases duplicate_of source_trust_level confidence_score verification_status tags raw_sources last_reinforced github_commit tech_stack
wiki-2026-0508-write-barrier Write Barrier 10_Wiki/Topics verified self
write barrier
store barrier
GC write barrier
none A 0.9 applied
garbage-collection
memory
runtime
gc
jvm
2026-05-10 pending
language framework
C++/Rust/Java GC runtimes

Write Barrier

매 한 줄

"매 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 (대조).

매 응용

  1. 매 generational collector의 minor GC가 old gen scan 안 해도 됨.
  2. 매 concurrent marking의 lost-edge 방지.
  3. 매 region-based collector의 inter-region reference 추적.

💻 패턴

Card-marking (pseudo C)

// every "obj.field = val"
void store_ref(Object* obj, int idx, Object* val) {
  obj->fields[idx] = val;
  // 매 barrier
  uintptr_t card = ((uintptr_t)obj) >> 9;  // 512B
  card_table[card] = DIRTY;
}

SATB barrier

void satb_store(Object* obj, int idx, Object* val) {
  Object* old = obj->fields[idx];
  if (concurrent_marking_active && old != NULL && !is_marked(old))
    enqueue_satb(old);  // preserve snapshot
  obj->fields[idx] = val;
}

Incremental update barrier

void inc_store(Object* obj, int idx, Object* val) {
  obj->fields[idx] = val;
  if (concurrent_marking_active && val != NULL && is_grey_or_white(val))
    enqueue_mark(val);  // re-scan
}

Rust / unsafe 매 manual barrier (toy)

unsafe fn write_field(obj: *mut Obj, off: usize, val: *mut Obj) {
    let slot = (obj as *mut u8).add(off) as *mut *mut Obj;
    *slot = val;
    // card mark
    let card_idx = (obj as usize) >> 9;
    CARD_TABLE[card_idx].store(1, Ordering::Relaxed);
}

V8 (incremental marking write barrier)

// simplified
template<typename T>
void StoreInObject(HeapObject host, T value) {
  host.SetSlot(offset, value);
  if (incremental_marking_running) {
    if (IsWhite(value)) MarkObject(value);
  }
}

매 결정 기준

상황 GC choice
매 latency-critical (low pause) ZGC / Shenandoah (read+write barriers)
매 throughput-critical Parallel GC (no concurrent barrier)
매 balanced G1 (SATB + card)
매 manual memory Rust / C++ — 매 barrier 의 X

기본값: 매 modern JVM = G1 (Java 9+ default), 매 ultra-low pause = ZGC.

🔗 Graph

🤖 LLM 활용

언제: 매 GC tuning, 매 runtime 구현. 언제 X: 매 application-level code — 매 mostly invisible.

안티패턴

  • 매 barrier 비활성화 시도: 매 GC invariant 깨짐 → silent heap corruption.
  • 매 barrier overhead 무시: 매 hot loop의 매 store 마다 추가 instruction.

🧪 검증 / 중복

  • Verified (Jones, Hosking, Moss — The Garbage Collection Handbook 2nd; OpenJDK ZGC docs 2026).
  • 신뢰도 A.

🕓 Changelog

날짜 변경
2026-05-08 Phase 1
2026-05-10 Manual cleanup — write barrier types + GC examples