[G1-Sync] Manual knowledge update
This commit is contained in:
@@ -1,10 +1,10 @@
|
||||
---
|
||||
id: P-REINFORCE-AUTO-4670EE
|
||||
id: [[P-Reinforce]]-AUTO-4670EE
|
||||
category: "10_Wiki/💡 Topics/Programming & Language"
|
||||
confidence_score: 0.90
|
||||
tags: [auto-reinforced]
|
||||
last_reinforced: 2026-04-20
|
||||
github_commit: "[P-Reinforce] Continuous Worker - Nodejs 메모리 최적화"
|
||||
github_commit: "[P-Reinforce] Continuous Worker - [[Nodejs]] 메모리 최적화"
|
||||
---
|
||||
|
||||
# [[Nodejs 메모리 최적화]]
|
||||
@@ -15,13 +15,13 @@ github_commit: "[P-Reinforce] Continuous Worker - Nodejs 메모리 최적화"
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
**V8 메모리 구조 및 가비지 컬렉션(GC)**
|
||||
* Node.js의 V8 엔진은 메모리를 힙(Heap)과 스택(Stack)으로 나누어 관리합니다 [5]. 스택은 지역 변수 및 함수 호출 프레임을 후입선출(LIFO) 원칙에 따라 관리하며, 힙은 동적으로 생성된 자바스크립트 객체와 데이터가 저장되는 곳으로 가비지 컬렉터의 주요 관리 대상이 됩니다 [6, 7].
|
||||
* 세대별 가설(Generational hypothesis)에 기반하여 힙은 '새로운 공간(New Space)'과 '오래된 공간(Old Space)'으로 나뉩니다 [5]. New Space에서는 단기 객체가 할당되며, 가볍고 빠른 마이너 GC(Scavenger)가 자주 실행되어 사용되지 않는 메모리를 회수합니다 [5, 8].
|
||||
* New Space에서 여러 번의 GC 주기를 생존한 객체들은 장기 보존 데이터로 간주되어 Old Space로 승격(Promotion)되며, 이 영역은 무겁지만 덜 빈번하게 실행되는 메이저 GC(Mark-Sweep-Compact 알고리즘)를 통해 관리됩니다 [5, 9, 10].
|
||||
* 세대별 가설([[Generational Hypothesis]])에 기반하여 힙은 '새로운 공간(New Space)'과 '오래된 공간([[Old Space]])'으로 나뉩니다 [5]. New Space에서는 단기 객체가 할당되며, 가볍고 빠른 마이너 GC([[Scavenge]]r)가 자주 실행되어 사용되지 않는 메모리를 회수합니다 [5, 8].
|
||||
* New Space에서 여러 번의 GC 주기를 생존한 객체들은 장기 보존 데이터로 간주되어 Old Space로 승격(Promotion)되며, 이 영역은 무겁지만 덜 빈번하게 실행되는 메이저 GC([[Mark-Sweep]]-Compact 알고리즘)를 통해 관리됩니다 [5, 9, 10].
|
||||
|
||||
**메모리 누수 감지 및 모니터링**
|
||||
* `process.memoryUsage()`를 사용하면 RSS(Resident Set Size), `heapTotal`, `heapUsed` 등의 수치를 통해 실행 중인 프로세스의 메모리 상태를 파악할 수 있습니다 [11].
|
||||
* `process.[[memory]]Usage()`를 사용하면 RSS(Resident Set Size), `heapTotal`, `heapUsed` 등의 수치를 통해 실행 중인 프로세스의 메모리 상태를 파악할 수 있습니다 [11].
|
||||
* 상용 환경에서는 `prom-client`를 통해 메모리 메트릭을 추출하고 Grafana와 같은 도구로 경고 규칙(Alert rule)을 설정하여, 메모리 부족(OOM) 크래시가 발생하기 전 누수를 조기 감지하는 것이 좋습니다 [12].
|
||||
* 누수가 의심될 때는 `--inspect` 플래그를 통해 Chrome DevTools에 연결하여 객체 할당 타임라인을 기록하거나, `heapdump` 라이브러리 및 `--heap-prof` 플래그를 활용해 힙 스냅샷을 캡처하여 추적할 수 있습니다 [2, 12, 13]. 트래픽 발생 전후의 두 가지 힙 스냅샷을 비교하면 반환되지 않고 남아 있는 메모리 할당 객체들을 정확히 찾아낼 수 있습니다 [13].
|
||||
* 누수가 의심될 때는 `--inspect` 플래그를 통해 [[Chrome DevTools]]에 연결하여 객체 할당 타임라인을 기록하거나, `heapdump` 라이브러리 및 `--heap-prof` 플래그를 활용해 힙 스냅샷을 캡처하여 추적할 수 있습니다 [2, 12, 13]. 트래픽 발생 전후의 두 가지 힙 스냅샷을 비교하면 반환되지 않고 남아 있는 메모리 할당 객체들을 정확히 찾아낼 수 있습니다 [13].
|
||||
|
||||
**자주 발생하는 메모리 누수 원인과 해결 패턴**
|
||||
* **이벤트 리스너 누적:** `on('event', fn)` 호출 후 리스너를 명시적으로 제거하지 않아 발생하며, 단일 이벤트 발생기에 리스너가 10개를 초과하면 `MaxListenersExceededWarning`이 발생하여 누수를 강력히 암시합니다 [14, 15].
|
||||
@@ -39,7 +39,7 @@ github_commit: "[P-Reinforce] Continuous Worker - Nodejs 메모리 최적화"
|
||||
- **정책 변화:** Programming & Language 분야의 자동 자산화 수행.
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
- **Related Topics:** [[V8 JavaScript Engine]], Garbage Collection (GC), [[Heap Snapshot]]
|
||||
- **Related Topics:** [[V8 [[JavaScript]] Engine]], [[Garbage Collection]] (GC), [[Heap Snapshot]]
|
||||
- **Projects/Contexts:** [[Chrome DevTools Memory Profiling]], Node.js Production Environments
|
||||
- **Contradictions/Notes:** `--expose-gc` 플래그를 통한 수동 가비지 컬렉션 호출(`global.gc()`)은 대량의 데이터 처리 후 즉시 메모리를 회수해야 하는 특수 상황에서 유용할 수 있지만, 일반적인 V8의 자동 GC 메커니즘을 대체하는 것은 아니며 남용 시 과도한 GC 사이클 실행으로 인해 애플리케이션 성능을 크게 저하시킬 위험이 있습니다 [20].
|
||||
|
||||
|
||||
Reference in New Issue
Block a user