--- id: P-REINFORCE-AUTO-3D2466 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 Memory Management" --- # [[Nodejs Memory Management]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > 지식 μš”μ•½ 정보 μΆ”μΆœ 쀑... ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) **V8 λ©”λͺ¨λ¦¬ μ•„ν‚€ν…μ²˜ (Stack & Heap)** * Node.jsλ₯Ό μ‹€ν–‰ν•˜λŠ” V8 엔진은 λ©”λͺ¨λ¦¬λ₯Ό μŠ€νƒ(Stack)κ³Ό νž™(Heap)으둜 λ‚˜λˆ„μ–΄ κ΄€λ¦¬ν•©λ‹ˆλ‹€ [1, 2]. * μŠ€νƒμ€ 정적 데이터, λ©”μ„œλ“œ/ν•¨μˆ˜ ν”„λ ˆμž„, μ›μ‹œ κ°’, νž™μ— μžˆλŠ” 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” 포인터λ₯Ό LIFO(Last In, First Out) λ°©μ‹μœΌλ‘œ μ €μž₯ν•˜λ©°, μš΄μ˜μ²΄μ œμ— μ˜ν•΄ 맀우 λΉ λ₯΄κ²Œ μžλ™ κ΄€λ¦¬λ©λ‹ˆλ‹€ [1, 10-12]. * νž™μ€ μ‹€ν–‰ μ‹œκ°„μ— 크기가 κ²°μ •λ˜λŠ” 동적 객체가 μ €μž₯λ˜λŠ” 곳으둜 κ°€λΉ„μ§€ 컬렉터(GC)의 μ£Όμš” 관리 λŒ€μƒμ΄ λ©λ‹ˆλ‹€ [10, 13, 14]. νž™ λ‚΄λΆ€λŠ” 객체의 수λͺ…κ³Ό λͺ©μ μ— 따라 New-space(Young generation), Old-space(Old generation), Large-object-space, Code-space, Map-space λ“±μœΌλ‘œ μ„ΈλΆ„ν™”λ©λ‹ˆλ‹€ [14-16]. **μ„ΈλŒ€λ³„ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ (Generational Garbage Collection)** * **Minor GC (Scavenger):** New-spaceλ₯Ό κ΄€λ¦¬ν•˜λŠ” λΉ λ₯΄κ³  λΉˆλ²ˆν•œ μ»¬λ ‰ν„°μž…λ‹ˆλ‹€ [17, 18]. New-spaceλŠ” μ ˆλ°˜μ”© To-space와 From-space둜 λ‚˜λ‰˜λ©°(Cheney's algorithm), ν• λ‹Ή 포인터가 곡간 끝에 λ„λ‹¬ν•˜λ©΄ μ‚΄μ•„μžˆλŠ” 객체만 To-space둜 λ³΅μ‚¬ν•˜κ³  죽은 객체λ₯Ό λ²„λ¦½λ‹ˆλ‹€ [18-20]. 이 과정을 두 번 μƒμ‘΄ν•œ κ°μ²΄λŠ” Old-space둜 승격(Promotion)λ©λ‹ˆλ‹€ [17, 19, 20]. * **Major GC (Mark-Sweep-Compact):** Old-spaceκ°€ 일정 ν•œλ„μ— λ„λ‹¬ν•˜λ©΄ μ‹€ν–‰λ˜λ©°, Mark-Sweep-Compact μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•©λ‹ˆλ‹€ [17, 21-23]. 루트(μŠ€νƒ, μ „μ—­ 객체 λ“±)μ—μ„œ μ‹œμž‘ν•΄ 도달 κ°€λŠ₯ν•œ 객체λ₯Ό νƒμƒ‰ν•˜μ—¬ λ§ˆν‚Ή(Marking)ν•˜κ³ , 도달할 수 μ—†λŠ” μ˜μ—­μ„ 회수(Sweeping)ν•˜λ©°, ν•„μš” μ‹œ 살아남은 객체λ₯Ό λͺ¨μ•„ λ‹¨νŽΈν™”λ₯Ό μ€„μ΄λŠ” μ••μΆ•(Compacting)을 μˆ˜ν–‰ν•©λ‹ˆλ‹€ [21, 24-27]. * **Orinoco ν”„λ‘œμ νŠΈ:** 전톡적인 GC의 단점인 κΈ΄ μΌμ‹œ μ •μ§€(Stop-the-world) 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ„μž…λœ V8의 GC μ•„ν‚€ν…μ²˜μž…λ‹ˆλ‹€ [28-30]. μž‘μ—… μŠ€λ ˆλ“œλ₯Ό ν™œμš©ν•˜μ—¬ GC μž‘μ—…μ„ 병렬(Parallel), 점진적(Incremental), λ™μ‹œμ (Concurrent)으둜 μˆ˜ν–‰ν•˜μ—¬ 메인 μŠ€λ ˆλ“œμ˜ λΆ€ν•˜μ™€ 지연을 μ΅œμ†Œν™”ν•©λ‹ˆλ‹€ [31-37]. **λ©”λͺ¨λ¦¬ λˆ„μˆ˜ (Memory Leaks) λ°œμƒ νŒ¨ν„΄ 및 뢄석** * Node.jsμ—μ„œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λŠ” 객체가 μœ μ‹€λœ 것이 μ•„λ‹ˆλΌ κ°œλ°œμžκ°€ μ˜λ„μΉ˜ μ•Šκ²Œ μ°Έμ‘°(Reference)λ₯Ό μœ μ§€ν•˜μ—¬ κ°€λΉ„μ§€ 컬렉터가 이λ₯Ό μ‚΄μ•„μžˆλŠ” κ²ƒμœΌλ‘œ κ°„μ£Όν•  λ•Œ λ°œμƒν•©λ‹ˆλ‹€ [8, 38, 39]. * 정상적인 GC 사이클을 κ±°μΉ˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ ν†±λ‹ˆλ°”ν€΄(Sawtooth) ν˜•νƒœμ˜ λ©”λͺ¨λ¦¬ μ‚¬μš© νŒ¨ν„΄μ„ λ³΄μ΄μ§€λ§Œ, λˆ„μˆ˜κ°€ μžˆλŠ” 경우 ν•΄μ œλ˜μ§€ μ•Šκ³  계속 μ¦κ°€λ§Œ ν•˜λŠ” 라쳇(Ratchet) νŒ¨ν„΄μ„ λ³΄μž…λ‹ˆλ‹€ [40-42]. * μ£Όμš” λˆ„μˆ˜ μ›μΈμœΌλ‘œλŠ” 이벀트 λ¦¬μŠ€λ„ˆ λˆ„μ (예: `EventEmitter` κ²½κ³ ), ν•΄μ œλ˜μ§€ μ•Šμ€ 타이머/μΈν„°λ²Œ(Timer Drift), ν΄λ‘œμ € λ³€μˆ˜ 보쑴(Closure Retention), ν•œλ„ μ—†λŠ” 인메λͺ¨λ¦¬ μΊμ‹œ, μ’…λ£Œλ˜μ§€ μ•Šμ€ 슀트림(Streams) 등이 μžˆμŠ΅λ‹ˆλ‹€ [39, 43-46]. **λͺ¨λ‹ˆν„°λ§ 및 λ©”λͺ¨λ¦¬ νŠœλ‹ (Monitoring and Tuning)** * μ½”λ“œ μƒμ—μ„œ `process.memoryUsage()`λ₯Ό 톡해 rss, heapTotal, heapUsed λ“±μ˜ λ©”λͺ¨λ¦¬ μ§€ν‘œλ₯Ό 좔적할 수 있으며 [47, 48], `--trace-gc` ν”Œλž˜κ·Έλ‚˜ V8 λͺ¨λ“ˆ, 퍼포먼슀 ν›…(Performance Hooks)을 톡해 GC ν™œλ™ 둜그λ₯Ό 뢄석할 수 μžˆμŠ΅λ‹ˆλ‹€ [49-51]. * λ°œκ²¬ν•˜κΈ° νž˜λ“  λˆ„μˆ˜ 뢄석 μ‹œμ—λŠ” Chrome DevTools의 Memory νŒ¨λ„μ„ μ΄μš©ν•˜μ—¬ νž™ μŠ€λƒ…μƒ·(Heap Snapshots)을 λΉ„κ΅ν•˜κ±°λ‚˜ Allocation Timeline을 κΈ°λ‘ν•˜μ—¬ λˆ„μˆ˜ λŒ€μƒμ„ μΆ”μ ν•©λ‹ˆλ‹€ [40, 52-57]. * Node.js μ‹€ν–‰ μ‹œ ν”Œλž˜κ·Έλ₯Ό 톡해 λ©”λͺ¨λ¦¬λ₯Ό μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€. `--max-old-space-size`둜 Old-space ν•œλ„λ₯Ό λŠ˜λ¦¬κ±°λ‚˜, `--max-semi-space-size`둜 New-space 크기λ₯Ό ν‚€μšΈ 수 있으며, `--expose-gc`λ₯Ό μ„€μ •ν•˜λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ `global.gc()`λ₯Ό 톡해 μˆ˜λ™μœΌλ‘œ GCλ₯Ό μœ λ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€ [58-62]. * 포인터 μ••μΆ•(Pointer Compression) 기술둜 인해 64λΉ„νŠΈ μ‹œμŠ€ν…œμ—μ„œλ„ V8 νž™μ€ μ΅œλŒ€ 4GB둜 μ œν•œλ  수 있으며, 이λ₯Ό μ΄ˆκ³Όν•  경우 λΉˆλ²ˆν•œ GC λ°œμƒ 및 OOM이 일어날 수 μžˆμŠ΅λ‹ˆλ‹€ [63-66]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[V8 JavaScript Engine]], [[Garbage Collection]], [[Orinoco GC]], [[Memory Leaks]], [[Pointer Compression]] - **Projects/Contexts:** [[Node.js Production Monitoring]], [[Chrome DevTools Memory Profiling]] - **Contradictions/Notes:** `--expose-gc` μ˜΅μ…˜μ„ μ‚¬μš©ν•΄ μ½”λ“œ λ‚΄μ—μ„œ μˆ˜λ™μœΌλ‘œ GC(`global.gc()`)λ₯Ό ν˜ΈμΆœν•˜μ—¬ λ©”λͺ¨λ¦¬λ₯Ό νšŒμˆ˜ν•  μˆ˜λŠ” μžˆμœΌλ‚˜, κ³Όλ„ν•˜κ²Œ μ‚¬μš©ν•˜λ©΄ ν”„λ‘œκ·Έλž¨ μ„±λŠ₯ μ €ν•˜(Performance degradation)λ₯Ό μ΄ˆλž˜ν•  수 μžˆμœΌλ―€λ‘œ μ£Όμ˜ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€κ³  κ²½κ³ ν•©λ‹ˆλ‹€ [62, 67]. --- *Last updated: 2026-04-19* - Raw Source: [[00_Raw/2026-04-20/Node.js Memory Management.md]] ---