Files
2nd/01_Archive/2026-04-20/V8 Heap Architecture.md

48 lines
5.6 KiB
Markdown

---
id: P-REINFORCE-AUTO-0C14B5
category: "10_Wiki/💡 Topics/Programming & Language"
confidence_score: 0.90
tags: [auto-reinforced]
last_reinforced: 2026-04-20
github_commit: "[P-Reinforce] Continuous Worker - V8 Heap Architecture"
---
# [[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|Garbage Collection]], [[Generational Hypothesis|Generational Hypothesis]], [[V8 Memory Cage|V8 Memory Cage]], [[Pointer Compression|Pointer Compression]]
- **Projects/Contexts:** [[Google Chrome|Google Chrome]], [[Node.js|Node.js]], [[Electron|Electron]]
- **Contradictions/Notes:** 일반적으로 V8 페이지의 크기는 1MB로 알려져 있으나 [12], 모바일 장치나 데스크탑 환경에서의 메모리 단편화 개선 및 사용량 최적화를 위해 512KB로 축소 적용되기도 하였다 [13, 14].
---
*Last updated: 2026-04-19*
- Raw Source: 00_Raw/2026-04-20/V8 Heap Architecture.md
---