---
id: P-REINFORCE-AUTO-5617F2
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-Compact)"
---

# [[마크-컴팩트(Mark-Compact)|마크-컴팩트(Mark-Compact)]]

## 📌 한 줄 통찰 (The Karpathy Summary)
> 지식 요약 정보 추출 중...

## 📖 구조화된 지식 (Synthesized Content)
*   **작동 원리 (마킹 및 컴팩팅 단계):** 
    마크-컴팩트 알고리즘은 마크-스윕(Mark-Sweep)과 매우 밀접하게 관련되어 있으며, **마킹(Marking)과 컴팩팅(Compacting)이라는 두 가지 주요 단계**로 작동합니다 [2]. 마킹 단계에서는 루트(root)로부터 도달할 수 있는 힙 내의 모든 라이브 객체를 깊이 우선 탐색(DFS) 방식으로 추적하며 발견된 객체들을 회색(grey)이나 흑색(black) 상태로 마킹합니다 [3, 8-10]. 마킹 알고리즘이 종료되면 모든 라이브 객체는 흑색으로, 죽은(dead) 객체는 백색(white)으로 남게 되며 이 정보가 컴팩팅 단계에서 활용됩니다 [11].

*   **컴팩팅 프로세스 (단편화 해소):** 
    컴팩팅 단계는 힙 메모리가 심하게 단편화되어 있을 때 실행되며, 수많은 작은 빈 공간을 포함하고 있는 **단편화된 페이지의 객체들을 다른 페이지의 빈 공간(Free list)으로 이주시킴으로써 실제 메모리 사용량을 줄이려 시도**합니다 [4-6]. 각 라이브 객체는 새로 할당된 공간으로 복사되며, 원래 객체의 첫 번째 단어에는 새로운 위치를 가리키는 포워딩 주소(forwarding address)가 남겨집니다 [4]. 만약 기존 페이지가 모두 비워지면(evacuated) 운영 체제(OS)에 다시 반환될 수 있으며, 필요에 따라 새로운 페이지가 할당되기도 합니다 [4, 6].

*   **포인터 업데이트와 성능 비용:** 
    객체가 메모리 내에서 이동함에 따라, 해당 객체들을 가리키고 있던 다른 객체들의 모든 참조(reference) 또한 새로운 주소로 변경되어야 합니다 [4, 7]. V8 엔진의 경우, 대피(evacuation)가 진행되는 동안 포인터의 위치들이 기록되며, 대피가 완료된 후 리스트를 순회하며 **복사된 새로운 위치를 가리키도록 포인터를 업데이트**합니다 [4]. 이러한 대규모 이동 및 참조 수정 작업으로 인해 힙을 컴팩팅하는 과정은 **비용이 매우 많이 드는 오퍼레이션(expensive operation)**으로 간주됩니다 [7]. 만약 특정 페이지를 가리키는 외부 포인터가 너무 많은 '인기 있는(popular)' 페이지라면, 기록을 중단하고 다음 GC 사이클 때까지 대피를 연기하기도 합니다 [4].

*   **트리거(Trigger) 조건:** 
    수백 메가바이트의 데이터를 포함할 수 있는 Old Space를 수집하기 위해 실행되지만 [2, 3], 항상 수행되는 것은 아닙니다. 예를 들어 IBM GC 정책의 경우, 기본적으로 컴팩트 작업을 피하지만 `-Xcompactgc` 커맨드 라인 옵션을 강제 지정했을 때, 스윕(sweep) 후에도 할당 요청을 충족할 여유 공간이 부족할 때, 명시적 `System.gc()` 호출 시 특정 조건을 만족할 때 등의 상황에서 발생합니다 [7, 12].

## ⚠️ 모순 및 업데이트 (Contradictions & RL Update)
- **과거 데이터와의 충돌:** 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
- **정책 변화:** Programming & Language 분야의 자동 자산화 수행.

## 🔗 지식 연결 (Graph)
- **Related Topics:** [[가비지 컬렉션(Garbage Collection)|가비지 컬렉션(Garbage Collection)]], [[마크-스윕(Mark-Sweep)|마크-스윕(Mark-Sweep)]], 단편화(Fragmentation)
- **Projects/Contexts:** [[V8 JavaScript Engine|V8 JavaScript Engine]], IBM SDK/Eclipse OpenJ9
- **Contradictions/Notes:** 소스 상에서 마크-컴팩트 알고리즘의 개념에 대한 모순은 없습니다. 다만 V8(자바스크립트)에서는 주로 'Old Space'를 정리하기 위해 설계된 메이저 가비지 컬렉션의 핵심 메커니즘으로 소개되며 [1, 2], IBM OpenJ9(자바) 환경에서는 고비용 오퍼레이션이라는 이유로 기본적으로는 발생하지 않되, 공간 고갈이나 명시적 옵션 적용 시 발생하는 조건부 동작으로 자세히 묘사됩니다 [7, 12].

---
*Last updated: 2026-04-19*
- Raw Source: 00_Raw/2026-04-20/마크-컴팩트(Mark-Compact).md
---
