Files
2nd/01_Archive/2026-04-20/Mark-Sweep-Compact.md
T

4.1 KiB

id, category, confidence_score, tags, last_reinforced, github_commit
id category confidence_score tags last_reinforced github_commit
P-REINFORCE-AUTO-1D592D 10_Wiki/💡 Topics/Programming & Language 0.90
auto-reinforced
2026-04-20 [P-Reinforce] Continuous Worker - Mark-Sweep-Compact

Mark-Sweep-Compact

📌 한 줄 통찰 (The Karpathy Summary)

지식 요약 정보 추출 중...

📖 구조화된 지식 (Synthesized Content)

동작 원리 및 주요 단계

  • 마킹(Marking) 단계: 힙 상의 모든 활성(Live) 객체를 발견하고 표시하는 과정입니다 [3]. 메모리 힙을 객체들이 포인터로 연결된 방향성 그래프로 간주하여, 루트(root) 객체에서 시작해 깊이 우선 탐색(Depth-First-Search)을 수행합니다 [8, 9]. 객체는 처리 상태에 따라 흰색(미발견), 회색(발견되었으나 이웃 미처리), 검은색(발견 및 이웃 처리 완료)으로 구분됩니다 [3, 10]. 마킹이 종료되면 검은색은 활성 객체, 흰색은 죽은 객체를 의미합니다 [4, 11].
  • 스위핑(Sweeping) 단계: 마킹 맵을 스캔하여 마킹되지 않은(흰색) 죽은 객체들의 연속된 범위를 찾고, 이를 빈 공간(Free space)으로 변환하여 크기별 프리 리스트(Free lists)에 추가합니다 [4, 12, 13].
  • 컴팩팅(Compacting) 단계: 파편화가 심한 페이지에 있는 객체들을 다른 페이지의 빈 공간으로 이주(Migration)시켜 실제 메모리 사용량을 줄입니다 [5, 14]. 객체가 복사된 후 기존 객체의 첫 번째 워드에 포워딩 주소(Forwarding address)를 남기고, 대피가 완료되면 시스템은 기록된 포인터 위치를 순회하며 참조를 새 위치로 업데이트합니다 [5, 10].

V8 엔진에서의 활용 (Major GC)

  • V8 엔진에서는 메가바이트 단위 이상의 크기를 갖는 'Old Space(오래된 세대)'를 수집할 때 마크-스윕(Mark-sweep) 및 마크-컴팩트(Mark-compact) 알고리즘을 사용합니다 [1, 10].
  • 과거에는 전체 실행을 멈추는 "Stop-the-world" 방식으로 인해 500-1000ms의 긴 일시 정지가 발생했으나, 메인 스레드의 부담을 줄이기 위해 증분 마킹(Incremental marking)과 지연 스위핑(Lazy sweeping), 그리고 백그라운드 스레드를 활용하는 동시 마킹/스위핑(Concurrent marking/sweeping) 등의 최적화가 도입되었습니다 [15-18].

IBM Java GC에서의 활용

  • Java 가비지 컬렉터에서도 마크와 스윕은 메모리를 재확보하는 핵심 사이클로 함께 작동합니다 [19].
  • 그러나 컴팩트(Compact) 작업은 객체의 참조(Reference)를 모두 변경해야 하므로 매우 비용이 많이 드는(Expensive) 작업으로 간주됩니다 [7]. 따라서 컴팩트 작업은 기본적으로 매번 발생하지 않으며, -Xcompactgc 옵션을 명시하거나 힙을 스위핑한 후에도 할당 요청을 충족할 공간이 부족할 때 등 특정한 트리거 조건 하에서만 수행됩니다 [7, 20].

⚠️ 모순 및 업데이트 (Contradictions & RL Update)

  • 과거 데이터와의 충돌: 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
  • 정책 변화: Programming & Language 분야의 자동 자산화 수행.

🔗 지식 연결 (Graph)

  • Related Topics: Garbage Collection, Old Generation, Incremental Marking, Memory Fragmentation
  • Projects/Contexts: V8 JavaScript Engine, IBM Java GC, Orinoco Garbage Collector
  • Contradictions/Notes: 컴팩트(Compact) 단계의 빈도와 관련하여, V8에서는 Old Space의 파편화를 줄이기 위해 Major GC 과정에서 컴팩팅을 통합적으로 활용하여 객체를 마이그레이션하는 반면 [5, 10], IBM Java GC 환경에서는 객체 이동에 따른 높은 오버헤드로 인해 컴팩트 단계가 기본 활성화 상태가 아니며 메모리 부족이나 명시적 설정 시에만 제한적으로 트리거된다는 차이가 있습니다 [7, 21].

Last updated: 2026-04-19

  • Raw Source: 00_Raw/2026-04-20/Mark-Sweep-Compact.md