---
id: P-REINFORCE-AUTO-1D592D
category: "[[10_Wiki/💡 Topics/Programming & Language]]"
confidence_score: 0.90
tags: [auto-reinforced]
last_reinforced: 2026-04-20
github_commit: "[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]]
---
