Files
2nd/10_Wiki/Topics/가비지 컬렉터(Garbage Collector).md
T
2026-05-02 23:33:34 +09:00

5.0 KiB


id: P-Reinforce-AUTO-A11817 category: Unified confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - 가비지 컬렉터(Garbage Collector)"

가비지 컬렉터(Garbage Collector)

📌 한 줄 통찰 (The Karpathy Summary)

가비지 컬렉터(Garbage Collector, GC)는 프로그램에서 더 이상 사용되지 않는 메모리(Dead regions)를 자동으로 식별하여 운영체제나 새로운 객체 할당을 위해 재사용하도록 수거하는 메모리 관리 메커니즘입니다 [1, 2]. 스택 변수나 전역 객체와 같은 '루트(Root) 객체'에서부터 포인터 체인을 통해 도달할 수 있는 객체는 '활성(Live)' 상태로 간주하고, 도달할 수 없는 모든 객체는 가비지로 판단합니다 [1, 3, 4]. 개발자가 메모리를 명시적으로 관리할 필요성을 덜어주는 장점이 있지만, 메모리 관리에 대한 제어권을 잃게 되고 실행을 멈추게 하는 예측 불가능한 지연(Pause)을 유발할 수 있는 양날의 검과 같습니다 [5, 6].

📖 구조화된 지식 (Synthesized Content)

  • 가비지 컬렉션의 기본 원리와 객체 탐색 가비지 컬렉션의 핵심 과제는 메모리의 죽은 영역을 식별하는 것입니다 [1]. GC는 루트 객체에서 시작하여 객체 간의 참조(Pointer)를 추적(Trace)하는 방식을 사용합니다 [3, 7]. V8 엔진의 경우, 힙 내의 데이터와 포인터를 빠르게 식별하기 위해 단어(Word)의 마지막 비트를 플래그로 활용하는 'Tagged pointers(태그된 포인터)' 기법을 사용합니다 [8, 9].

  • 세대적 가설에 기반한 가비지 컬렉션 (Generational Garbage Collection) 대부분의 언어 환경에서는 "대부분의 객체는 생성 직후 빠르게 죽는다"는 세대적 가설(Generational Hypothesis)이 성립합니다 [10, 11]. 이를 활용하여 힙 메모리를 'Young Generation(신규 세대)'과 'Old Generation(구세대)'으로 분리하여 관리합니다 [12, 13].

    • Minor GC (Scavenger): V8 엔진의 신규 공간(New Space)에서 자주 발생하며 매우 빠르게 실행됩니다 [12, 14, 15]. 신규 공간을 두 개의 반공간(To-Space, From-Space)으로 나누고, 살아있는 객체만 새로운 공간으로 대피(Evacuation)시켜 파편화를 제거하는 알고리즘(Cheney's algorithm 등)을 사용합니다 [14-16]. 이 과정을 두 번 이상 살아남은 객체는 구세대 공간으로 승격(Promote)됩니다 [12, 17].
    • Major GC (Mark-Sweep-Compact): 구세대 공간에 쌓인 대규모 데이터를 수집할 때 사용됩니다 [18]. 전체 힙에서 살아있는 객체를 깊이 우선 탐색(DFS)으로 탐색하여 표시(Mark)하고, 죽은 객체가 차지한 공간을 청소(Sweep)하여 빈 목록(Free list)으로 반환합니다 [18-21]. 파편화가 심한 페이지의 경우 살아있는 객체를 모아 메모리를 압축(Compact)하기도 합니다 [21, 22].
  • 성능 최적화 및 최신 GC 기법 가비지 컬렉션 작업은 기본적으로 애플리케이션 실행을 완전히 멈추는 "Stop-the-world" 지연을 유발합니다 [2, 23]. 응답성 저하를 방지하기 위해 V8 엔진(Orinoco GC)이나 IBM JVM 등은 다음과 같은 발전된 기법을 사용합니다.

    • 병렬 처리(Parallel): 메인 스레드와 여러 헬퍼 스레드가 GC 작업을 분담하여 동시에 수행하여 전체 지연 시간을 단축합니다 [24, 25].
    • 점진적 처리(Incremental): 긴 GC 작업을 여러 개의 짧은 단계(Step)로 쪼개어, 메인 스레드에서 JavaScript 실행과 교차(Interleave)로 수행합니다 [24, 26, 27].
    • 동시 처리(Concurrent): 메인 스레드가 JavaScript를 계속 실행하는 동안, 백그라운드의 헬퍼 스레드가 마킹 및 스위핑 작업을 온전히 수행합니다 [24, 26, 28].

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

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

🔗 지식 연결 (Graph)

  • Related Topics: Generational Hypothesis, Mark-Sweep-Compact, Scavenge, Stop-the-world
  • Projects/Contexts: V8 Engine, Orinoco Garbage Collector, IBM ECLIPse OpenJ9
  • Contradictions/Notes: 소스에 따르면 V8 엔진은 메모리 효율을 높이기 위해 포인터 압축(Pointer Compression) 기술을 도입했는데, 이는 메모리와 성능 최적화에는 크게 기여하지만 64비트 시스템 환경에서도 V8의 최대 힙 크기를 4GB로 제한하게 만드는 부작용(Downside)을 초래합니다 [29, 30].

Last updated: 2026-04-19