Snapshot at the Beginning

Snapshot at the Beginning은 가비지 컬렉션(Garbage Collection, GC)에서 객체 참조 상태를 추적하기 위해 사용되는 전략이다. 주로 동시 가비지 컬렉션(Concurrent Garbage Collection)에서 사용되며, GC가 시작하는 시점의 객체 참조 상태(스냅샷)를 기준으로 살아있는 객체를 마킹한다. 이 전략은 객체 참조 상태의 동적 변경에 따른 복잡성을 최소화하는 데 목적이 있다.

개요

Snapshot at the Beginning은 GC가 시작될 때 힙 메모리의 객체 참조 그래프를 "스냅샷"으로 간주하고, 이를 기준으로 살아있는 객체를 추적한다. 애플리케이션이 실행 중이더라도, 변경 전의 참조 상태를 기준으로 가비지 컬렉션이 진행된다. 이 전략은 동시 가비지 컬렉션의 일관성과 성능을 보장하기 위해 설계되었다.

작동 원리

GC 시작

  • GC가 시작되면 현재 힙 메모리의 객체 참조 상태를 "스냅샷"으로 간주한다.
  • GC는 이 스냅샷을 기준으로 모든 작업을 수행한다.

마킹 단계

  • GC 루트(GC Roots)에서 시작하여 스냅샷 기준으로 도달 가능한 모든 객체를 탐색하고 마킹한다.
  • 애플리케이션 실행 중에 참조가 변경되더라도, 변경 전 상태를 기준으로 마킹한다.

Write Barrier 사용

  • GC가 실행되는 동안 객체 참조가 변경되면, Write Barrier를 통해 변경 사항이 기록된다.
  • GC는 Write Barrier 정보를 활용하여 변경된 참조를 다시 확인하거나 마킹 작업을 보완한다.

Compact/Free 단계

  • 마킹이 완료되면 스냅샷 기준으로 살아있지 않은 객체를 해제하거나 메모리를 압축(compaction)한다.

장점

  • 일관성 유지
 GC가 시작된 시점의 객체 참조 상태를 기준으로 작업을 수행하므로, 참조 변경에도 일관된 결과를 보장한다.
  • 애플리케이션 실행과의 독립성
 애플리케이션이 실행 중이더라도, GC 작업은 안정적으로 수행된다.
  • 효율적인 동시 수집
 Snapshot at the Beginning은 동시 GC에서 객체 참조 변경으로 인한 복잡성을 줄이며, 성능 최적화를 돕는다.

단점

  • Write Barrier 오버헤드
 참조 변경을 기록하기 위해 Write Barrier가 추가적으로 실행되므로, CPU 성능에 약간의 영향을 미친다.
  • False Negatives
 참조가 변경된 경우, 스냅샷 기준으로 살아있지 않은 객체가 실제로는 참조되고 있을 수 있다. 이를 방지하기 위해 추가적인 마킹 작업이 필요하다.
  • GC 지연 가능성
 객체 참조 변경이 잦을 경우 Write Barrier 처리로 인해 GC 작업이 지연될 가능성이 있다.

사용 알고리즘

Snapshot at the Beginning 전략은 다음의 가비지 컬렉션 알고리즘에서 사용된다:

  • CMS(Concurrent Mark-Sweep) GC
 CMS는 Snapshot at the Beginning 방식을 활용하여 객체 참조를 마킹하며, Write Barrier를 통해 변경 사항을 기록한다.
  • G1GC
 G1GC는 동시 마킹 및 객체 참조 관리에서 이와 유사한 스냅샷 접근 방식을 사용한다.
  • ZGC 및 Shenandoah
 최신 가비지 컬렉션 알고리즘에서도 Snapshot at the Beginning 접근 방식을 사용하여 동시성과 성능을 최적화한다.