--- id: P-REINFORCE-AUTO-7A23E5 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 μ„±λŠ₯ 디버깅" --- # [[Nodejs ᄉα…₯α†Όα„‚α…³α†Ό 다ᄇα…₯α„€α…΅α†Ό|Nodejs μ„±λŠ₯ 디버깅]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > Node.js μ„±λŠ₯ 디버깅은 주둜 V8 μ—”μ§„μ˜ νž™(Heap) λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ μΆ”μ ν•˜κ³  κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(GC) λ™μž‘μ„ λΆ„μ„ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯ μ €ν•˜ 및 λ©”λͺ¨λ¦¬ λˆ„μˆ˜(Memory Leak)λ₯Ό ν•΄κ²°ν•˜λŠ” 과정이닀 [1, 2]. νž™ μŠ€λƒ…μƒ·(Heap Snapshot), ν• λ‹Ή νƒ€μž„λΌμΈ, GC νŠΈλ ˆμ΄μ‹± λ“±μ˜ 진단 도ꡬλ₯Ό ν™œμš©ν•˜μ—¬ λ©”λͺ¨λ¦¬ λ‚΄μ—μ„œ λΆˆν•„μš”ν•˜κ²Œ μœ μ§€λ˜λŠ” μ°Έμ‘° 객체λ₯Ό μ‹λ³„ν•œλ‹€ [3-5]. 이와 λ”λΆˆμ–΄, μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°λ§ API 및 V8 λͺ…령쀄 ν”Œλž˜κ·Έ νŠœλ‹μ„ 톡해 λ©”λͺ¨λ¦¬ ν•œκ³„λ₯Ό μ‘°μ •ν•˜μ—¬ μ„œλ²„ μ•ˆμ •μ„±κ³Ό μ²˜λ¦¬λŸ‰μ„ μ΅œμ ν™”ν•  수 μžˆλ‹€ [6-8]. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) * **λ©”λͺ¨λ¦¬ λˆ„μˆ˜μ˜ μ •μ˜μ™€ μ£Όμš” νŒ¨ν„΄** Node.jsμ—μ„œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λŠ” κ°€λΉ„μ§€ 컬렉터(GC)에 μ˜ν•΄ μˆ˜κ±°λ˜μ–΄μ•Ό ν•  객체가 ν΄λ‘œμ €(Closure), μ „μ—­ λ³€μˆ˜ 등에 μ˜ν•΄ μ—¬μ „νžˆ μ°Έμ‘°λ₯Ό μœ μ§€ν•˜κ³  μžˆμ„ λ•Œ λ°œμƒν•œλ‹€ [3, 9]. 이둜 인해 μ‹œκ°„μ΄ 지남에 따라 λ©”λͺ¨λ¦¬κ°€ μ§€μ†μ μœΌλ‘œ μ¦κ°€ν•˜λ©°, 결과적으둜 ν”„λ‘œμ„ΈμŠ€κ°€ Out-Of-Memory(OOM) 였λ₯˜λ‘œ 인해 쀑단될 수 μžˆλ‹€ [10, 11]. Node.js ν™˜κ²½μ—μ„œ κ°€μž₯ ν”ν•˜κ²Œ λ°œμƒν•˜λŠ” λˆ„μˆ˜ νŒ¨ν„΄μ€ λ‹€μŒκ³Ό κ°™λ‹€: * **이벀트 λ¦¬μŠ€λ„ˆ λˆ„μ **: `on('event', fn)`을 μ§€μ†μ μœΌλ‘œ μΆ”κ°€ν•˜κ³  μ œκ±°ν•˜μ§€ μ•ŠμœΌλ©΄ ν•΄λ‹Ή 콜백 ν•¨μˆ˜μ™€ κ΄€λ ¨λœ λ©”λͺ¨λ¦¬κ°€ λˆ„μˆ˜λœλ‹€ [12]. * **ν΄λ‘œμ €(Closure) λ³€μˆ˜ 보쑴**: 비동기 μ²΄μΈμ΄λ‚˜ μŠ€μ½”ν”„λ₯Ό κ³΅μœ ν•˜λŠ” ν΄λ‘œμ € 내뢀에 큰 객체λ₯Ό μΊ‘μ²˜ν•΄ 두면 ν•΄λ‹Ή ν΄λ‘œμ €μ˜ 수λͺ… μ£ΌκΈ° λ™μ•ˆ λ©”λͺ¨λ¦¬κ°€ μœ μ§€λœλ‹€ [13, 14]. * **λ¬΄μ œν•œ μΊμ‹œ(Unbounded Cache)**: 인메λͺ¨λ¦¬ μΊμ‹œμ˜ ν¬κΈ°λ‚˜ 만료λ₯Ό μ œν•œν•˜μ§€ μ•ŠμœΌλ©΄ 데이터가 끝없이 μΆ•μ λœλ‹€ [14]. * **μ •λ¦¬λ˜μ§€ μ•Šμ€ 타이머**: `clearInterval`이 ν˜ΈμΆœλ˜μ§€ μ•Šμ€ `setInterval`은 콜백 ν΄λ‘œμ €μ— μžˆλŠ” λͺ¨λ“  ν•­λͺ©μ˜ GCλ₯Ό λ°©μ§€ν•œλ‹€ [15, 16]. * **λ‹«νžˆμ§€ μ•Šμ€ 슀트림 및 μ†ŒμΌ“**: μ˜¬λ°”λ₯΄κ²Œ μ’…λ£Œλ˜μ§€ μ•Šμ€ μŠ€νŠΈλ¦Όμ€ λ‚΄λΆ€ 버퍼와 λ„€νŠΈμ›Œν¬ 핸듀을 μ μœ ν•œλ‹€ [16]. * **λ©”λͺ¨λ¦¬ 디버깅 및 ν”„λ‘œνŒŒμΌλ§ 도ꡬ** * **νž™ μŠ€λƒ…μƒ·(Heap Snapshots)**: νŠΉμ • μ‹œμ μ˜ 전체 λ©”λͺ¨λ¦¬ μƒνƒœλ₯Ό μΊ‘μ²˜ν•˜λŠ” κΈ°λŠ₯으둜, Chrome DevToolsμ—μ„œ μŠ€λƒ…μƒ·λ“€μ„ 비ꡐ('Comparison' λ·°)ν•˜μ—¬ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό 검사할 수 μžˆλ‹€ [4, 17-19]. `--inspect` ν”Œλž˜κ·Έλ‘œ μ—°κ²°ν•˜κ±°λ‚˜ `heapdump` νŒ¨ν‚€μ§€λ₯Ό μ‚¬μš©ν•΄ μΊ‘μ²˜ν•œ λ’€ 'ν• λ‹Ήλœ ν›„ ν•΄μ œλ˜μ§€ μ•Šμ€ 객체(Objects allocated between snapshots)'λ₯Ό μ°Ύμ•„λ‚Έλ‹€ [4, 5, 18]. * **ν• λ‹Ή νƒ€μž„λΌμΈ(Allocation Timeline)**: νŠΉμ • μ‹œκ°„ λ™μ•ˆμ˜ λ©”λͺ¨λ¦¬ 할당을 μ‹œκ°μ μœΌλ‘œ μΆ”μ ν•œλ‹€ [17, 20]. κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ 후에도 μ‚΄μ•„μžˆλŠ” κ°μ²΄λŠ” νŒŒλž€μƒ‰ λ§‰λŒ€λ‘œ ν‘œμ‹œλ˜λ©°, 이λ₯Ό 톡해 λ©”λͺ¨λ¦¬ λˆ„μˆ˜ 후보λ₯Ό νŠΉμ •ν•  수 μžˆλ‹€ [5, 17, 20]. * **GC νŠΈλ ˆμ΄μ‹±(--trace-gc)**: `--trace-gc` ν”Œλž˜κ·Έλ₯Ό μ‚¬μš©ν•΄ μ‹€ν–‰ν•˜λ©΄ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ˜ μ„ΈλΆ€ λ°œμƒ μ‹œκ°„, μ†Œμš” μ‹œκ°„, GC μ „ν›„μ˜ νž™ μš©λŸ‰ λ³€ν™”λ₯Ό μ½˜μ†”μ—μ„œ 확인할 수 μžˆλ‹€ [5, 21, 22]. λ§Œμ•½ Mark-sweep(였래된 μ„ΈλŒ€ GC) μž‘μ—…μ΄ μ§€λ‚˜μΉ˜κ²Œ λΉˆλ²ˆν•˜κ±°λ‚˜ GC 이후에도 νž™μ΄ μ›λž˜ μˆ˜μ€€μœΌλ‘œ 쀄어듀지 μ•ŠμœΌλ©΄ λ©”λͺ¨λ¦¬ λˆ„μˆ˜μ˜ κ°•λ ₯ν•œ μ‹ ν˜Έμ΄λ‹€ [23]. * **λ©”λͺ¨λ¦¬ λͺ¨λ‹ˆν„°λ§ API**: μ½”λ“œ λ‚΄μ—μ„œ `process.memoryUsage()`λ₯Ό ν˜ΈμΆœν•˜μ—¬ ν”„λ‘œμ„ΈμŠ€μ— ν• λ‹Ήλœ 전체 λ©”λͺ¨λ¦¬(`rss`)와 νž™μ˜ μ΄λŸ‰(`heapTotal`), ν˜„μž¬ μ‚¬μš© 쀑인 νž™(`heapUsed`) 등을 μ‹€μ‹œκ°„μœΌλ‘œ νŒŒμ•…ν•  수 μžˆλ‹€ [6, 7]. * **λ©”λͺ¨λ¦¬ νŠœλ‹ 및 μ΅œμ ν™”** Node.jsλŠ” V8 μ—”μ§„μ˜ λ©”λͺ¨λ¦¬ μ œν•œ 및 GC λΉˆλ„λ₯Ό 직접 μ œμ–΄ν•  수 μžˆλŠ” λͺ…령쀄 ν”Œλž˜κ·Έλ₯Ό μ œκ³΅ν•œλ‹€ [7]. * `--max-old-space-size`: 수λͺ…이 κΈ΄ 객체듀이 μ €μž₯λ˜λŠ” Old Space의 크기 ν•œλ„λ₯Ό μ„€μ •ν•˜μ—¬, 지속적인 데이터λ₯Ό λ‹€λ£° λ•Œ OOM을 μ§€μ—°μ‹œν‚€κ±°λ‚˜ μ˜ˆλ°©ν•  수 μžˆλ‹€ [8, 24]. * `--max-semi-space-size`: λΉˆλ²ˆν•˜κ²Œ 생성 및 μ†Œλ©Έλ˜λŠ” 객체가 μ €μž₯λ˜λŠ” New Space의 크기λ₯Ό μ‘°μ ˆν•œλ‹€. μ²˜λ¦¬λŸ‰μ΄ λ§Žμ€ μƒν™©μ—μ„œ 이 크기λ₯Ό 늘리면 μž¦μ€ Scavenge(λ§ˆμ΄λ„ˆ GC) 사이클을 쀄여 μ„±λŠ₯을 ν–₯상할 수 μžˆλ‹€ [24, 25]. * `--expose-gc`: 이λ₯Ό μ„€μ •ν•˜λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œ λ‚΄μ—μ„œ `global.gc()`λ₯Ό μˆ˜λ™μœΌλ‘œ ν˜ΈμΆœν•˜μ—¬ λŒ€λŸ‰μ˜ 데이터 처리 ν›„ λͺ…μ‹œμ μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό νšŒμˆ˜ν•  수 μžˆλ‹€ [26, 27]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[V8 JavaScript Engine|V8 JavaScript Engine]], [[Garbage Collection|Garbage Collection]], [[Heap Snapshot|Heap Snapshot]], [[Memory Leak|Memory Leak]] - **Projects/Contexts:** [[Chrome DevTools Memory Panel|Chrome DevTools Memory Panel]], Node.js Production Environment - **Contradictions/Notes:** μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμžκ°€ `System.gc()` λ˜λŠ” `global.gc()`λ₯Ό μ‚¬μš©ν•˜μ—¬ μˆ˜λ™μœΌλ‘œ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ„ νŠΈλ¦¬κ±°ν•  μˆ˜λŠ” μžˆμœΌλ‚˜, GC λ™μž‘μ„ μž„μ˜λ‘œ 예츑 및 κ°•μ œ μ‹€ν–‰ν•˜λŠ” ν–‰μœ„λŠ” 였히렀 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯을 μ €ν•˜μ‹œν‚¬ 수 μžˆμœΌλ―€λ‘œ μ£Όμ˜ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€ [27, 28]. --- *Last updated: 2026-04-19* - Raw Source: 00_Raw/2026-04-20/Node.js μ„±λŠ₯ 디버깅.md ---