44 lines
5.1 KiB
Markdown
44 lines
5.1 KiB
Markdown
---
|
|
id: P-REINFORCE-AUTO-1E11F0
|
|
category: "10_Wiki/💡 Topics/Programming & Language"
|
|
confidence_score: 0.90
|
|
tags: [auto-reinforced]
|
|
last_reinforced: 2026-04-20
|
|
github_commit: "[P-Reinforce] Continuous Worker - 힙 스냅샷 (Heap Snapshots)"
|
|
---
|
|
|
|
# [[힙 스냅샷 (Heap Snapshots)|힙 스냅샷 (Heap Snapshots)]]
|
|
|
|
## 📌 한 줄 통찰 (The Karpathy Summary)
|
|
> 힙 스냅샷(Heap Snapshots)은 특정 시점에 애플리케이션의 자바스크립트 객체와 관련된 DOM 노드가 차지하는 메모리 분포 및 전체 객체 그래프를 캡처하여 보여주는 분석 도구입니다 [1, 2]. 이 도구는 메모리 그래프를 분석하거나 여러 스냅샷을 비교하여 메모리 누수를 찾아내고 객체 참조 트리를 확인하는 데 주로 사용됩니다 [2]. 힙 스냅샷을 생성하는 작업은 항상 가비지 컬렉션(Garbage Collection)과 함께 시작되며, 전역 객체(global object)에서 도달 가능한 객체들만을 화면에 표시합니다 [3].
|
|
|
|
## 📖 구조화된 지식 (Synthesized Content)
|
|
* **메모리 누수 탐지 기법 (3-스냅샷 기법):**
|
|
가장 신뢰할 수 있는 메모리 누수 탐지 방법은 3개의 스냅샷을 사용하는 것입니다 [4]. 먼저 기준점이 되는 스냅샷 1을 찍은 후, 누수가 의심되는 작업(예: 모달 열기/닫기, 라우트 이동 등)을 수행하고 스냅샷 2를 찍습니다 [4]. 이후 동일한 작업을 반복한 뒤 스냅샷 3을 캡처합니다 [4]. 스냅샷 2와 3을 비교하여, 스냅샷 1과 2 사이에 할당되었으나 스냅샷 3에서도 여전히 가비지 컬렉션되지 않고 살아있는 객체들을 누수 후보로 특정할 수 있습니다 [4].
|
|
|
|
* **객체 식별 및 추적 메커니즘:**
|
|
스냅샷 내의 객체들에는 `@` 기호 뒤에 고유한 ID 번호가 부여됩니다 [5-7]. 가비지 컬렉션이 발생하면 메모리 상에서 객체의 주소가 이동할 수 있으므로 주소를 표시하는 것은 의미가 없으며, 대신 이 고유 ID를 통해 여러 스냅샷 간에 동일한 객체의 상태를 정밀하게 비교하고 추적할 수 있습니다 [5, 7].
|
|
|
|
* **주요 분석 뷰(Views):**
|
|
힙 스냅샷은 분석 목적에 따라 다양한 시점을 제공합니다 [8].
|
|
* **Summary (요약):** 객체들을 생성자(Constructor) 이름과 소스별로 그룹화하여 보여줍니다 [8]. 각 객체에 대해 루트로부터의 거리(`Distance`), 객체 자체가 차지하는 메모리 크기(`Shallow size`), 그리고 해당 객체를 삭제할 경우 확보할 수 있는 메모리 크기(`Retained size`)를 확인할 수 있습니다 [9].
|
|
* **Comparison (비교):** 두 개 이상의 스냅샷 간의 차이를 분석하며, 작업 전후의 메모리 델타(추가 및 삭제된 객체 인스턴스)를 검사하여 메모리 누수를 확인합니다 [8, 10].
|
|
* **Containment (포함):** `DOMWindow` 객체, 가비지 컬렉터가 사용하는 `GC roots`, 브라우저의 `Native objects`를 진입점으로 삼아 애플리케이션의 메모리 사용 구조를 거시적으로 보여주며 클로저 등을 로우 레벨에서 분석하게 돕습니다 [8, 11, 12].
|
|
|
|
* **Retainers (유지자) 분석:**
|
|
힙 스냅샷 인터페이스 하단의 Retainers 패널은 선택된 특정 객체를 메모리에 유지시키고 있는 다른 객체들의 참조 체인을 가비지 컬렉션 루트에서부터 역순으로 보여줍니다 [1, 12, 13]. 이 참조 체인을 추적하면 객체가 왜 수집되지 않았는지 근본 원인을 찾아 코드를 수정할 수 있습니다 [1, 14].
|
|
|
|
## ⚠️ 모순 및 업데이트 (Contradictions & RL Update)
|
|
- **과거 데이터와의 충돌:** 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
|
|
- **정책 변화:** Programming & Language 분야의 자동 자산화 수행.
|
|
|
|
## 🔗 지식 연결 (Graph)
|
|
- **Related Topics:** [[가비지 컬렉션 (Garbage Collection)|가비지 컬렉션 (Garbage Collection)]], [[메모리 누수(Memory Leaks)|메모리 누수 (Memory Leaks)]], Shallow Size, Retained Size, [[할당 타임라인(Allocation Timeline)|할당 타임라인 (Allocation Timeline)]]
|
|
- **Projects/Contexts:** Chrome DevTools 메모리 패널, [[V8 자바스크립트 엔진|V8 자바스크립트 엔진]]
|
|
- **Contradictions/Notes:** 원시 힙 스냅샷에는 사용자의 애플리케이션 객체뿐만 아니라 `(compiled code)`, `(concatenated string)`, `InternalNode` 등 수천 개의 V8 내부 항목들이 포함되어 있으므로, 생성자 필터를 통해 애플리케이션 객체에 초점을 맞춰야 합니다 [15-19]. 또한 메모리 그래프가 커진다고 해서 모두 누수인 것은 아니며(캐시 보존 등 의도적 보존일 수 있음), 네이티브 코드로 실행되는 getter가 구현된 프로퍼티나 숫자 같은 비문자열 값은 자바스크립트 힙에 저장되지 않아 스냅샷에 캡처되지 않는다는 점을 유의해야 합니다 [15, 20].
|
|
|
|
---
|
|
*Last updated: 2026-04-19*
|
|
- Raw Source: 00_Raw/2026-04-20/힙 스냅샷 (Heap Snapshots).md
|
|
---
|