Files
2nd/10_Wiki/Topics/V8 Heap Architecture.md
T
2026-05-02 23:33:34 +09:00

5.6 KiB


id: P-Reinforce-AUTO-0C14B5 category: Unified confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - V8 Heap Architecture"

V8 Heap Architecture

📌 한 줄 통찰 (The Karpathy Summary)

V8 엔진의 힙(Heap) 아키텍처는 자바스크립트 런타임에 동적으로 할당되는 데이터와 객체를 저장하기 위해 구조화된 메모리 영역이다 [1]. V8은 메모리 할당 속도를 높이고 가비지 컬렉션(GC)의 오버헤드를 줄이기 위해, 객체의 수명 주기에 기반한 '세대별 가설(Generational Hypothesis)'을 적용하여 힙을 여러 특수 공간(Space)으로 분할한다 [2, 3]. 이를 통해 각기 다른 메모리 영역의 특성에 맞는 최적화된 메모리 회수 알고리즘을 적용할 수 있다 [2].

📖 구조화된 지식 (Synthesized Content)

힙의 주요 공간(Spaces) V8의 힙은 객체의 특성과 수명에 따라 여러 개의 고유한 공간으로 나뉘어 관리된다.

  • New Space (Young Generation): 대부분의 새로운 객체가 최초로 할당되는 공간으로, 1MB에서 8MB(또는 64MB) 사이의 작은 크기로 유지된다 [4-6]. 이 공간은 가비지 컬렉션을 매우 빠르게 수행하도록 설계되었으며, 내부적으로 'To-Space'와 'From-Space'라는 두 개의 동일한 반공간(semi-space)으로 나뉜다 [6, 7]. 이 영역은 Scavenger라 불리는 Minor GC 알고리즘(Cheney's algorithm 기반)에 의해 관리되며, 여기서 두 번의 GC 주기를 살아남은 객체는 Old Space로 이동(승격, Promotion)된다 [5-7].
  • Old Space (Old Generation): New Space에서 살아남은 수명이 긴 객체들이 저장되는 공간으로 훨씬 더 큰 크기를 갖는다 [4, 5, 8]. 가비지 컬렉터의 마킹 속도를 최적화하기 위해, 다른 객체에 대한 포인터를 포함하는 Old-pointer-space와 문자열이나 박싱된 숫자처럼 원시 데이터만 포함하여 포인터 추적이 필요 없는 Old-data-space로 세분화된다 [2, 4, 8]. 이 공간은 Mark-Sweep-Compact 방식의 Major GC에 의해 관리된다 [9].
  • Large Object Space: 다른 공간의 크기 제한(일반적으로 1MB)을 초과하는 거대한 객체들이 저장된다 [2, 4]. 각 객체는 운영체제로부터 mmap을 통해 직접 할당받은 전용 메모리 영역을 가지며, 가비지 컬렉터에 의해 결코 메모리 위치가 이동되지 않는다 [2, 4].
  • Code Space: JIT(Just-In-Time) 컴파일러가 생성한 실행 가능한 기계어 코드(Code objects)가 할당되는 곳이다 [2, 4]. 힙 내에서 유일하게 실행 권한(Executable)이 부여된 메모리 공간이다 [2, 4].
  • 특수 및 불변 공간: 모든 객체의 크기가 동일하여 수집을 단순화할 수 있는 Cell-space, Property-cell-space, Map-space가 있으며 [4, 10], 변하지 않고 이동하지 않는 불변 객체를 저장하는 Read Only Space도 존재한다 [11].

페이지(Pages) 구조 힙의 각 공간은 '페이지(Pages)'라는 여러 개의 연속된 메모리 청크의 집합으로 구성된다 [3, 12].

  • 일반적으로 페이지의 크기는 1MB이며 1MB 단위로 정렬되지만, Large Object Space의 페이지는 더 클 수 있다 [12]. 최근에는 저메모리 환경 최적화를 위해 페이지 크기를 512KB로 줄여 메모리 단편화를 감소시키고 압축 효율을 높인 사례도 있다 [3, 13, 14].
  • 각 페이지에는 메모리 객체 외에도 다양한 플래그와 메타데이터가 담긴 헤더(Header), 라이브 객체를 나타내는 마킹 비트맵(Marking bitmap)이 포함된다 [3, 12].
  • 또한 별도의 메모리에 할당된 슬롯 버퍼(Slots buffer)를 가져, 해당 페이지에 있는 객체를 가리키는 다른 객체들의 포인터 목록인 '기억 집합(Remembered set)'을 형성한다 [3, 12].

포인터 압축과 메모리 케이지(V8 memory Cage) 보안 및 성능 최적화를 위해 V8은 64비트 플랫폼에서 '포인터 압축(Pointer Compression)' 기술을 사용한다 [15, 16].

  • 객체의 참조를 64비트 전체 주소 대신, 기준 주소(Base address)로부터의 32비트 오프셋(Offset)으로 저장하여 객체 포인터의 메모리 오버헤드를 절반으로 줄인다 [16].
  • 이 방식은 구조적으로 모든 V8 힙 객체가 4GB 크기의 연속된 메모리 영역인 "케이지(Cage)" 내부에 갇혀 있도록 강제한다 [16, 17]. 따라서 전체 시스템의 메모리가 아무리 많아도, 단일 V8 인스턴스의 관리되는 힙 크기는 4GB를 초과할 수 없다 [17, 18].

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

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

🔗 지식 연결 (Graph)

  • Related Topics: Garbage Collection, Generational Hypothesis, V8 Memory Cage, Pointer Compression
  • Projects/Contexts: Google Chrome, Node.js, Electron
  • Contradictions/Notes: 일반적으로 V8 페이지의 크기는 1MB로 알려져 있으나 [12], 모바일 장치나 데스크탑 환경에서의 메모리 단편화 개선 및 사용량 최적화를 위해 512KB로 축소 적용되기도 하였다 [13, 14].

Last updated: 2026-04-19