--- id: P-REINFORCE-AUTO-2F9E62 category: "10_Wiki/πŸ’‘ Topics/Programming & Language" confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - λ©”λͺ¨λ¦¬ λˆ„μˆ˜(Memory Leaks)" --- # [[λ©”λͺ¨λ¦¬ λˆ„μˆ˜(Memory Leaks)]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ ν™˜κ²½μ—μ„œμ˜ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λŠ” κ°œλ°œμžκ°€ 더 이상 ν•„μš”λ‘œ ν•˜μ§€ μ•ŠλŠ” 객체듀이 κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(GC) λ£¨νŠΈλ‘œλΆ€ν„° μ—¬μ „νžˆ 참쑰되고 μžˆμ–΄ λ©”λͺ¨λ¦¬κ°€ ν•΄μ œλ˜μ§€ μ•ŠλŠ” ν˜„μƒμ„ μ˜λ―Έν•œλ‹€ [1-4]. μ΄λŸ¬ν•œ ν˜„μƒμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ μ μ§„μ μœΌλ‘œ μ¦κ°€μ‹œν‚€λ©°, 결과적으둜 μž¦μ€ GC 싀행에 λ”°λ₯Έ μ„±λŠ₯ μ €ν•˜μ™€ λ©”λͺ¨λ¦¬ λΆ€μ‘±(OOM) ν¬λž˜μ‹œλ₯Ό μœ λ°œν•œλ‹€ [5, 6]. 일반적인 λ©”λͺ¨λ¦¬ μœ μ‹€κ³Ό 달리, μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œμ˜ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λŠ” 기본적으둜 μ½”λ“œ μ–΄λ”˜κ°€μ— λ‚¨μ•„μžˆλŠ” μ›μΉ˜ μ•ŠλŠ” μ°Έμ‘° λ•Œλ¬Έμ— λ°œμƒν•œλ‹€ [1, 4]. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) * **λ°œμƒ λ©”μ»€λ‹ˆμ¦˜:** V8 μ—”μ§„κ³Ό 같은 λŸ°νƒ€μž„ ν™˜κ²½μ—μ„œ κ°μ²΄λŠ” κΈ€λ‘œλ²Œ 객체, ν™œμ„± ν΄λ‘œμ €, 이벀트 λ¦¬μŠ€λ„ˆ, 타이머 λ“±μœΌλ‘œλΆ€ν„° 도달 κ°€λŠ₯(reachable)ν•œ μƒνƒœμΌ λ•Œ λ©”λͺ¨λ¦¬μ— μœ μ§€λœλ‹€ [1, 4]. 이 μ—°κ²° 고리λ₯Ό λŠμ§€ μ•ŠμœΌλ©΄ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œκ°„μ΄ κΈΈμ–΄μ§ˆμˆ˜λ‘ νž™(Heap) λ©”λͺ¨λ¦¬κ°€ ν•΄μ œλ˜μ§€ μ•Šκ³  계단식(Ratchet)으둜 μƒμŠΉν•˜λŠ” νŒ¨ν„΄μ„ 보인닀 [7, 8]. 특히 수λͺ…이 κΈ΄ 객체듀이 λͺ¨μ΄λŠ” V8의 'Old space' μ˜μ—­ μ‚¬μš©λŸ‰μ΄ Major GC 이후에도 μ§€μ†μ μœΌλ‘œ μ¦κ°€ν•œλ‹€λ©΄ λ©”λͺ¨λ¦¬ λˆ„μˆ˜μΌ ν™•λ₯ μ΄ 맀우 λ†’λ‹€ [9, 10]. * **μ£Όμš” λˆ„μˆ˜ νŒ¨ν„΄:** μ†ŒμŠ€μ— λ”°λ₯΄λ©΄ λ‹€μŒκ³Ό 같은 μƒν™©μ—μ„œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λΉˆλ²ˆν•˜κ²Œ λ°œμƒν•œλ‹€. * **이벀트 λ¦¬μŠ€λ„ˆ 및 타이머 좕적:** λ Œλ”λ§ μ£ΌκΈ°λ‚˜ μΈν„°λ²Œ μ½œλ°±μ—μ„œ μΆ”κ°€λœ λ¦¬μŠ€λ„ˆ 및 타이머(setInterval λ“±)λ₯Ό 적절히 μ œκ±°ν•˜μ§€ μ•ŠμœΌλ©΄, ν•΄λ‹Ή 콜백의 ν΄λ‘œμ €μ™€ 참쑰된 객체듀이 λ¬΄κΈ°ν•œ λ©”λͺ¨λ¦¬μ— λ‚¨κ²Œ λœλ‹€ [11-14]. Node.js ν™˜κ²½μ—μ„œ 단일 μ΄λ²€νŠΈμ— 10개 μ΄μƒμ˜ λ¦¬μŠ€λ„ˆκ°€ 좔가될 λ•Œ λ°œμƒν•˜λŠ” `MaxListenersExceededWarning` κ²½κ³ λŠ” λˆ„μˆ˜ λ°œμƒμ„ ν™•μΈν•˜λŠ” λͺ…ν™•ν•œ μ§€ν‘œμ΄λ‹€ [15]. * **ν΄λ‘œμ € μŠ€μ½”ν”„ 보쑴:** μ—¬λŸ¬ ν΄λ‘œμ €κ°€ ν•˜λ‚˜μ˜ μŠ€μ½”ν”„λ₯Ό κ³΅μœ ν•˜λŠ” 경우, 단 ν•˜λ‚˜μ˜ ν΄λ‘œμ €λΌλ„ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜μ—¬ ν™œμ„± μƒνƒœλ₯Ό μœ μ§€ν•˜λ©΄ 동일 μŠ€μ½”ν”„ λ‚΄μ—μ„œ 캑처된 λ‹€λ₯Έ λŒ€μš©λŸ‰ 객체듀도 λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œλ˜μ§€ λͺ»ν•œλ‹€ [11, 15]. * **λΆ„λ¦¬λœ DOM λ…Έλ“œ:** DOM νŠΈλ¦¬μ—μ„œλŠ” μ œκ±°λ˜μ—ˆμœΌλ‚˜ JavaScript λ³€μˆ˜λ‚˜ Map/Set 등에 μ˜ν•΄ μ°Έμ‘°λ₯Ό μœ μ§€ν•˜κ³  μžˆλŠ” DOM μš”μ†ŒλŠ” ν•΄λ‹Ή μš”μ†Œκ°€ ν¬ν•¨λœ 전체 μ„œλΈŒνŠΈλ¦¬μ˜ λ©”λͺ¨λ¦¬λ₯Ό μ§€μ†μ μœΌλ‘œ μ μœ ν•œλ‹€ [16, 17]. * **λ¬΄μ œν•œ μΊμ‹œ 및 라우트 μ „ν™˜:** 크기 μ œν•œμ΄ μ—†λŠ” μΊμ‹œ 데이터, ν˜Ήμ€ SPA(Single Page Application)μ—μ„œ 이전 라우트의 μ»΄ν¬λ„ŒνŠΈκ°€ μ „μ—­ μƒνƒœ μ°Έμ‘°λ‚˜ λ¦¬μŠ€λ„ˆλ₯Ό μ •λ¦¬ν•˜μ§€ λͺ»ν•˜λŠ” 것도 μ£Όμš” λˆ„μˆ˜ 원인이닀 [15, 18]. * **μž˜λΌλ‚Έ λ¬Έμžμ—΄(Sliced String):** κ±°λŒ€ν•œ λ¬Έμžμ—΄μ˜ 일뢀뢄을 `substring()` λ“±μœΌλ‘œ 잘라 μ „μ—­ λ³€μˆ˜μ— 보관할 경우, μž˜λΌλ‚Έ λ¬Έμžμ—΄μ΄ 원본 λ¬Έμžμ—΄μ˜ 포인터λ₯Ό μœ μ§€ν•˜λ―€λ‘œ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 원본 λ¬Έμžμ—΄ 전체가 λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œλ˜μ§€ λͺ»ν•  수 μžˆλ‹€ [19]. * **진단 및 ν”„λ‘œνŒŒμΌλ§ 도ꡬ:** * Chrome DevTools의 'νž™ μŠ€λƒ…μƒ·(Heap Snapshots)'κ³Ό 'ν• λ‹Ή νƒ€μž„λΌμΈ(Allocation Timeline)'을 ν™œμš©ν•˜μ—¬ λˆ„μˆ˜λ₯Ό μ§„λ‹¨ν•œλ‹€ [20-23]. * νŠΉμ • λ™μž‘μ„ μˆ˜ν–‰ν•˜κΈ° μ „ν›„λ‘œ μ—¬λŸ¬ 번 μŠ€λƒ…μƒ·μ„ 찍어 λΉ„κ΅ν•˜λŠ” '3-μŠ€λƒ…μƒ· 기법'을 톡해, μ˜λ„μΉ˜ μ•Šκ²Œ λ‚¨μ•„μžˆλŠ” 객체λ₯Ό 효과적으둜 식별할 수 μžˆλ‹€ [20, 24]. νƒ€μž„λΌμΈμ— λ‚˜νƒ€λ‚˜λŠ” νŒŒλž€μƒ‰ λ§‰λŒ€λŠ” ν• λ‹Ή ν›„ ν•΄μ œλ˜μ§€ μ•Šμ€ μ‚΄μ•„μžˆλŠ” λ©”λͺ¨λ¦¬λ₯Ό μ˜λ―Έν•˜λ©°, 이λ₯Ό 톡해 잠재적인 λˆ„μˆ˜ 지점을 νŒŒμ•…ν•œλ‹€ [23, 25, 26]. * μ˜μ‹¬λ˜λŠ” 객체λ₯Ό μ°Ύμ•˜λ‹€λ©΄ DevTools의 'Retainers' νŒ¨λ„μ„ 톡해 ν•΄λ‹Ή 객체가 μ–΄λ–€ μ°Έμ‘° 경둜(Retaining Path)λ₯Ό 거쳐 GC λ£¨νŠΈμ— μ—°κ²°λ˜μ–΄ μžˆλŠ”μ§€ μ—­μΆ”μ ν•˜μ—¬ 원인을 νŒŒμ•…ν•  수 μžˆλ‹€ [27-29]. * λ˜ν•œ `--trace-gc` ν”Œλž˜κ·Έ, `heapdump`, `clinic.js` 같은 도ꡬλ₯Ό μ‚¬μš©ν•˜μ—¬ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ λ™μž‘κ³Ό λ©”λͺ¨λ¦¬ 증가 μΆ”μ„Έλ₯Ό λͺ¨λ‹ˆν„°λ§ν•  수 μžˆλ‹€ [7, 13, 30, 31]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(Garbage Collection), [[V8 Heap Architecture]], νž™ μŠ€λƒ…μƒ·(Heap Snapshot), ν΄λ‘œμ €(Closure) - **Projects/Contexts:** Node.js Memory Leaks in Production, Browser Memory Leak Detection - **Contradictions/Notes:** C/C++ ν”„λ‘œκ·Έλž¨ 등에 μ‚¬μš©λ˜λŠ” 컴파일러 지원이 μ—†λŠ” 보수적(Conservative) κ°€λΉ„μ§€ μ»¬λ ‰ν„°μ˜ 경우, ν¬μΈν„°μ²˜λŸΌ λ³΄μ΄λŠ” 일반 μ •μˆ˜ λ°μ΄ν„°λ‘œ 인해 κ±°λŒ€ν•œ 객체 μ„œλΈŒκ·Έλž˜ν”„κ°€ μœ μ§€λ˜λŠ” λ…νŠΉν•œ ν˜•νƒœμ˜ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό μœ λ°œν•  κ°€λŠ₯성이 μ‘΄μž¬ν•œλ‹€κ³  μ†ŒμŠ€μ—μ„œ μ§€μ ν•œλ‹€ [32]. λ˜ν•œ ν”„λ‘ νŠΈμ—”λ“œ μ΅œμ‹  도ꡬ인 `WeakRef`와 `FinalizationRegistry`λ₯Ό μ‚¬μš©ν•΄ λˆ„μˆ˜μ— κ°•ν•œ νŒ¨ν„΄μ„ μž‘μ„±ν•  수 μžˆμœΌλ‚˜, κ°€λΉ„μ§€ μ»¬λ ‰ν„°λŠ” 자체 일정에 따라 μ‹€ν–‰λ˜μ–΄ 결정둠적이지 μ•ŠμœΌλ―€λ‘œ μ μ ˆν•œ 객체 수λͺ… μ£ΌκΈ° 관리λ₯Ό μ™„λ²½νžˆ λŒ€μ²΄ν•  μˆ˜λŠ” μ—†μŒμ— μœ μ˜ν•΄μ•Ό ν•œλ‹€ [12]. --- *Last updated: 2026-04-19* ---