--- 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 λ©”λͺ¨λ¦¬ μ΅œμ ν™”" --- # [[Nodejs 메모라 α„Žα…¬α„Œα…₯ᆨᄒα…ͺ|Nodejs λ©”λͺ¨λ¦¬ μ΅œμ ν™”]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > Node.jsλŠ” V8 엔진을 기반으둜 μ‹€ν–‰λ˜λŠ” 단일 ν”„λ‘œμ„ΈμŠ€μ΄λ―€λ‘œ, μ‹œκ°„μ΄ 지남에 따라 λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ μ§€μ†μ μœΌλ‘œ λˆ„μ λ  수 μžˆμ–΄ 효율적인 λ©”λͺ¨λ¦¬ 관리가 ν•„μˆ˜μ μž…λ‹ˆλ‹€ [1]. 정상적인 μƒνƒœμ˜ νž™ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ€ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(GC) 이후 μ›λž˜ μˆ˜μ€€μœΌλ‘œ λŒμ•„κ°€λŠ” ν†±λ‹ˆλ°”ν€΄(sawtooth) νŒ¨ν„΄μ„ λ³΄μ΄μ§€λ§Œ, λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λ°œμƒν•˜λ©΄ λ°˜ν™˜λ˜μ§€ μ•Šκ³  μ§€μ†μ μœΌλ‘œ μƒμŠΉν•˜λŠ” 래칫(ratchet) νŒ¨ν„΄μ„ κ·Έλ¦½λ‹ˆλ‹€ [2]. λ©”λͺ¨λ¦¬ μ΅œμ ν™”λŠ” 각쒅 νž™ ν”„λ‘œνŒŒμΌλ§ 도ꡬ와 λͺ…령쀄 ν”Œλž˜κ·Έλ₯Ό ν™œμš©ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λˆ„μˆ˜ νŒ¨ν„΄μ„ μ°Ύμ•„ ν•΄κ²°ν•˜κ³ , GC μ„€μ • 및 νž™ 곡간 크기λ₯Ό νŠœλ‹ν•˜μ—¬ μ‹œμŠ€ν…œμ˜ μ•ˆμ •μ„±κ³Ό μ„±λŠ₯을 κ·ΉλŒ€ν™”ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€ [2-4]. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (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]. **λ©”λͺ¨λ¦¬ λˆ„μˆ˜ 감지 및 λͺ¨λ‹ˆν„°λ§** * `process.memoryUsage()`λ₯Ό μ‚¬μš©ν•˜λ©΄ RSS(Resident Set Size), `heapTotal`, `heapUsed` λ“±μ˜ 수치λ₯Ό 톡해 μ‹€ν–‰ 쀑인 ν”„λ‘œμ„ΈμŠ€μ˜ λ©”λͺ¨λ¦¬ μƒνƒœλ₯Ό νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [11]. * μƒμš© ν™˜κ²½μ—μ„œλŠ” `prom-client`λ₯Ό 톡해 λ©”λͺ¨λ¦¬ λ©”νŠΈλ¦­μ„ μΆ”μΆœν•˜κ³  Grafana와 같은 λ„κ΅¬λ‘œ κ²½κ³  κ·œμΉ™(Alert rule)을 μ„€μ •ν•˜μ—¬, λ©”λͺ¨λ¦¬ λΆ€μ‘±(OOM) ν¬λž˜μ‹œκ°€ λ°œμƒν•˜κΈ° μ „ λˆ„μˆ˜λ₯Ό μ‘°κΈ° κ°μ§€ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€ [12]. * λˆ„μˆ˜κ°€ μ˜μ‹¬λ  λ•ŒλŠ” `--inspect` ν”Œλž˜κ·Έλ₯Ό 톡해 Chrome DevTools에 μ—°κ²°ν•˜μ—¬ 객체 ν• λ‹Ή νƒ€μž„λΌμΈμ„ κΈ°λ‘ν•˜κ±°λ‚˜, `heapdump` 라이브러리 및 `--heap-prof` ν”Œλž˜κ·Έλ₯Ό ν™œμš©ν•΄ νž™ μŠ€λƒ…μƒ·μ„ μΊ‘μ²˜ν•˜μ—¬ 좔적할 수 μžˆμŠ΅λ‹ˆλ‹€ [2, 12, 13]. νŠΈλž˜ν”½ λ°œμƒ μ „ν›„μ˜ 두 κ°€μ§€ νž™ μŠ€λƒ…μƒ·μ„ λΉ„κ΅ν•˜λ©΄ λ°˜ν™˜λ˜μ§€ μ•Šκ³  남아 μžˆλŠ” λ©”λͺ¨λ¦¬ ν• λ‹Ή 객체듀을 μ •ν™•νžˆ μ°Ύμ•„λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€ [13]. **자주 λ°œμƒν•˜λŠ” λ©”λͺ¨λ¦¬ λˆ„μˆ˜ 원인과 ν•΄κ²° νŒ¨ν„΄** * **이벀트 λ¦¬μŠ€λ„ˆ λˆ„μ :** `on('event', fn)` 호좜 ν›„ λ¦¬μŠ€λ„ˆλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ œκ±°ν•˜μ§€ μ•Šμ•„ λ°œμƒν•˜λ©°, 단일 이벀트 λ°œμƒκΈ°μ— λ¦¬μŠ€λ„ˆκ°€ 10개λ₯Ό μ΄ˆκ³Όν•˜λ©΄ `MaxListenersExceededWarning`이 λ°œμƒν•˜μ—¬ λˆ„μˆ˜λ₯Ό κ°•λ ₯히 μ•”μ‹œν•©λ‹ˆλ‹€ [14, 15]. * **ν΄λ‘œμ €(Closure) λ³€μˆ˜ μœ μ§€:** μš”μ²­ 및 응닡 객체 전체와 같은 μ»€λ‹€λž€ λ³€μˆ˜κ°€ ν΄λ‘œμ €μ— 캑처된 μƒνƒœλ‘œ μ½œλ°±μ΄λ‚˜ 비동기 체인 내에 남겨지면 κ°€λΉ„μ§€ 컬렉터가 이λ₯Ό μˆ˜μ§‘ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€ [15]. * **λ¬΄μ œν•œ μΊμ‹œ 및 μžŠν˜€μ§„ 타이머:** 인메λͺ¨λ¦¬ μΊμ‹œλ₯Ό μ‚¬μš©ν•  λ•Œ ν•œλ„λ₯Ό μ„€μ •ν•˜μ§€ μ•Šκ±°λ‚˜, `setInterval`둜 μƒμ„±λœ 타이머λ₯Ό `clearInterval`둜 μ •λ¦¬ν•˜μ§€ μ•ŠμœΌλ©΄ μ—°κ΄€λœ ν΄λ‘œμ € 전체가 λ©”λͺ¨λ¦¬μ— 영ꡬ적으둜 λ³΄μ‘΄λ©λ‹ˆλ‹€ [15, 16]. * **μ’…λ£Œλ˜μ§€ μ•Šμ€ 슀트림과 μ†ŒμΌ“:** μŠ€νŠΈλ¦Όμ΄λ‚˜ λ„€νŠΈμ›Œν¬ ν•Έλ“€μ˜ 응닡 본문을 λ‹€ μ†ŒλΉ„ν•˜μ§€ μ•Šμ€ 경우, λ‚΄λΆ€ 버퍼가 μœ μ§€λ˜λ―€λ‘œ λ°˜λ“œμ‹œ `cancel()`μ΄λ‚˜ `destroy()`λ₯Ό ν˜ΈμΆœν•΄ 정리해야 ν•©λ‹ˆλ‹€ [16]. **λ©”λͺ¨λ¦¬ νŠœλ‹μš© λͺ…령쀄 ν”Œλž˜κ·Έ(CLI Flags)** * `--max-old-space-size`: Old Space의 ν•œκ³„λ₯Ό λ©”κ°€λ°”μ΄νŠΈ(MB) λ‹¨μœ„λ‘œ μ„€μ •ν•˜λ©°, λŒ€λŸ‰μ˜ 데이터 배치 μ²˜λ¦¬λ‚˜ λ§Žμ€ μ‚¬μš©μž μ„Έμ…˜ λ“± λ©”λͺ¨λ¦¬ μ†Œλͺ¨κ°€ 큰 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯ μ €ν•˜ 및 OOM 방지에 μ‚¬μš©λ©λ‹ˆλ‹€ [4]. * `--max-semi-space-size`: New Space의 크기λ₯Ό μ‘°μ ˆν•˜λ©°, 단기 객체(예: API μš”μ²­λ§ˆλ‹€ μƒμ„±λ˜λŠ” μž„μ‹œ 객체)κ°€ λŒ€λŸ‰μœΌλ‘œ μƒμ„±λ˜λŠ” ν™˜κ²½μ—μ„œ 늘렀주면 μž¦μ€ λ§ˆμ΄λ„ˆ GC 싀행을 쀄여 μ „λ°˜μ μΈ μ„±λŠ₯을 높일 수 μžˆμŠ΅λ‹ˆλ‹€ [17]. * `--gc-interval` 및 `--expose-gc`: κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ˜ λΉˆλ„λ₯Ό κ°•μ œλ‘œ μ‘°μ •ν•˜κ±°λ‚˜, ν”„λ‘œκ·Έλž¨ λ‚΄λΆ€μ—μ„œ `global.gc()`λ₯Ό ν˜ΈμΆœν•΄ μˆ˜λ™μœΌλ‘œ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ„ μ‹€ν–‰ν•  수 μžˆλ„λ‘ ν•˜λŠ” μ˜΅μ…˜μž…λ‹ˆλ‹€ [18-20]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[V8 JavaScript Engine|V8 JavaScript Engine]], [[Garbage Collection (GC)|Garbage Collection (GC)]], [[Heap Snapshot|Heap Snapshot]] - **Projects/Contexts:** [[Chrome DevTools Memory Profiling|Chrome DevTools Memory Profiling]], Node.js Production Environments - **Contradictions/Notes:** `--expose-gc` ν”Œλž˜κ·Έλ₯Ό ν†΅ν•œ μˆ˜λ™ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ 호좜(`global.gc()`)은 λŒ€λŸ‰μ˜ 데이터 처리 ν›„ μ¦‰μ‹œ λ©”λͺ¨λ¦¬λ₯Ό νšŒμˆ˜ν•΄μ•Ό ν•˜λŠ” 특수 μƒν™©μ—μ„œ μœ μš©ν•  수 μžˆμ§€λ§Œ, 일반적인 V8의 μžλ™ GC λ©”μ»€λ‹ˆμ¦˜μ„ λŒ€μ²΄ν•˜λŠ” 것은 μ•„λ‹ˆλ©° λ‚¨μš© μ‹œ κ³Όλ„ν•œ GC 사이클 μ‹€ν–‰μœΌλ‘œ 인해 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„±λŠ₯을 크게 μ €ν•˜μ‹œν‚¬ μœ„ν—˜μ΄ μžˆμŠ΅λ‹ˆλ‹€ [20]. --- *Last updated: 2026-04-19* - Raw Source: 00_Raw/2026-04-20/Node.js λ©”λͺ¨λ¦¬ μ΅œμ ν™”.md ---