# [[Memory Leak Debugging]] ## πŸ“Œ Brief Summary λ©”λͺ¨λ¦¬ λˆ„μˆ˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•œ ν›„ 더 이상 ν•„μš”ν•˜μ§€ μ•ŠμŒμ—λ„ λΆˆκ΅¬ν•˜κ³  이λ₯Ό ν•΄μ œ(release)ν•˜μ§€ μ•Šμ•„ λ©”λͺ¨λ¦¬ μ†ŒλΉ„κ°€ μ§€μ†μ μœΌλ‘œ μ¦κ°€ν•˜λŠ” ν˜„μƒμ„ μ˜λ―Έν•©λ‹ˆλ‹€ [1]. μ΄λŸ¬ν•œ λ¬Έμ œλŠ” μ‹œκ°„μ΄ 지남에 따라 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯을 μ μ§„μ μœΌλ‘œ μ €ν•˜μ‹œν‚€κ³ , μΈν„°νŽ˜μ΄μŠ€λ₯Ό 느리게 λ§Œλ“€λ©°, ꢁ극적으둜 λΈŒλΌμš°μ € νƒ­μ˜ λ©ˆμΆ€μ΄λ‚˜ μΆ©λŒμ„ μœ λ°œν•©λ‹ˆλ‹€ [2-4]. ν”„λ‘ νŠΈμ—”λ“œ ν™˜κ²½μ—μ„œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό ν•΄κ²°ν•˜λ €λ©΄ Chrome DevTools와 같은 도ꡬλ₯Ό ν™œμš©ν•˜μ—¬ λ©”λͺ¨λ¦¬ 할당을 ν”„λ‘œνŒŒμΌλ§ν•˜κ³ , λΆ„λ¦¬λœ DOM λ…Έλ“œλ‚˜ μ •λ¦¬λ˜μ§€ μ•Šμ€ 이벀트 λ¦¬μŠ€λ„ˆ λ“±μ˜ 원인을 μ°Ύμ•„ μˆ˜μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€ [5-7]. ## πŸ“– Core Content * **λ©”λͺ¨λ¦¬ λˆ„μˆ˜μ˜ μ •μ˜μ™€ μ£Όμš” 증상** μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ κ°€λΉ„μ§€ 컬렉터(Garbage Collector)λŠ” μ‚¬μš©λ˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό μžλ™μœΌλ‘œ νšŒμˆ˜ν•˜μ§€λ§Œ, λ³€μˆ˜ 등에 μ°Έμ‘°κ°€ λ‚¨μ•„μžˆμ„ 경우 λ©”λͺ¨λ¦¬κ°€ ν•΄μ œλ˜μ§€ μ•Šκ³  λˆ„μˆ˜λ©λ‹ˆλ‹€ [1]. μ΄λŸ¬ν•œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λŠ” μž‘μ—… λΆ€ν•˜κ°€ 일정함에도 λΆˆκ΅¬ν•˜κ³  λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ κ°μ†Œν•˜μ§€ μ•Šκ³  κΎΈμ€€νžˆ μ¦κ°€ν•˜λŠ” νŠΉμ§•μ„ λ³΄μž…λ‹ˆλ‹€ [4]. μ£Όμš” μ¦μƒμœΌλ‘œλŠ” μž₯μ‹œκ°„ μ‚¬μš© ν›„ μ„±λŠ₯ μ €ν•˜, μž¦μ€ ν™”λ©΄ 멈좀, 특히 λͺ¨λ°”일 κΈ°κΈ°μ—μ„œμ˜ μž¦μ€ μ•± 좩돌 등이 μžˆμŠ΅λ‹ˆλ‹€ [2-4]. * **ν”„λ‘ νŠΈμ—”λ“œμ˜ μ£Όμš” λ©”λͺ¨λ¦¬ λˆ„μˆ˜ νŒ¨ν„΄** * **λΆ„λ¦¬λœ DOM λ…Έλ“œ (Detached DOM Nodes):** DOM νŠΈλ¦¬μ—μ„œλŠ” μ œκ±°λ˜μ—ˆμ§€λ§Œ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ‚˜ λ³€μˆ˜μ—μ„œ μ—¬μ „νžˆ μ°Έμ‘°λ₯Ό μœ μ§€ν•˜κ³  μžˆμ–΄ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ˜ λŒ€μƒμ΄ λ˜μ§€ λͺ»ν•˜λŠ” λ…Έλ“œμž…λ‹ˆλ‹€ [8, 9]. * **이벀트 λ¦¬μŠ€λ„ˆ λˆ„μ  (Event Listener Accumulation):** React의 `useEffect` λ“±μ—μ„œ μ»΄ν¬λ„ŒνŠΈκ°€ μ–Έλ§ˆμš΄νŠΈλ  λ•Œ λ“±λ‘λœ 이벀트 λ¦¬μŠ€λ„ˆλ‚˜ ꡬ독을 정리(cleanup) ν•΄μ£ΌλŠ” ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜μ§€ μ•ŠμœΌλ©΄ λ°œμƒν•©λ‹ˆλ‹€ [9-12]. * **ν΄λ‘œμ €μ— μ˜ν•΄ μœ μ§€λ˜λŠ” μ°Έμ‘° (Closure-Retained References):** ν΄λ‘œμ €κ°€ λΆ€λͺ¨ μŠ€μ½”ν”„μ˜ λ³€μˆ˜λ₯Ό 계속 살렀두어 λΆˆν•„μš”ν•˜κ²Œ 큰 객체λ₯Ό λ©”λͺ¨λ¦¬μ— λ‚¨κ²¨λ‘λŠ” κ²½μš°μž…λ‹ˆλ‹€ [13]. * **디버깅 및 탐지 방법** * **Chrome μž‘μ—… κ΄€λ¦¬μž:** μ‹€μ‹œκ°„μœΌλ‘œ λͺ¨λ‹ˆν„°λ§ν•˜λ©° 'JavaScript Memory' ν•­λͺ©μ˜ κ΄„ν˜Έ μ•ˆ 숫자(라이브 숫자)κ°€ κΎΈμ€€νžˆ μ¦κ°€ν•˜λŠ”μ§€ ν™•μΈν•˜μ—¬ λˆ„μˆ˜μ˜ 1차적 μ§•ν›„λ₯Ό λ°œκ²¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [14, 15]. * **μ„±λŠ₯ νŒ¨λ„ (Performance Panel):** μ‹œκ°„ 경과에 λ”°λ₯Έ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ μ‹œκ°ν™”ν•˜λ©°, κ°•μ œ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ 이후에도 JS νž™(Heap) 크기가 이전보닀 높은 μƒνƒœλ‘œ μ’…λ£Œλœλ‹€λ©΄ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό μ˜μ‹¬ν•΄μ•Ό ν•©λ‹ˆλ‹€ [16, 17]. * **νž™ μŠ€λƒ…μƒ· (Heap Snapshots):** λ©”λͺ¨λ¦¬ μƒνƒœμ˜ μŠ€λƒ…μƒ·μ„ μΊ‘μ²˜ν•œ λ’€ 'Detached' ν‚€μ›Œλ“œλ‘œ κ²€μƒ‰ν•˜μ—¬ λΆ„λ¦¬λœ DOM 트리λ₯Ό μ°Ύκ±°λ‚˜, μž‘μ—… μ „ν›„μ˜ 두 μŠ€λƒ…μƒ·μ„ 비ꡐ(Comparison)ν•˜μ—¬ μ§€μ†μ μœΌλ‘œ 델타(Delta) 크기가 μ¦κ°€ν•˜λŠ” 객체λ₯Ό 식별할 수 μžˆμŠ΅λ‹ˆλ‹€ [6, 9, 11, 18]. * **ν• λ‹Ή νƒ€μž„λΌμΈ (Allocation Timelines):** λ©”λͺ¨λ¦¬ ν• λ‹Ή νŒ¨ν„΄μ„ μ‹€μ‹œκ°„μœΌλ‘œ μΆ”μ ν•˜μ—¬, νšŒμƒ‰μœΌλ‘œ λ³€ν•˜μ§€ μ•Šκ³  λ‚¨μ•„μžˆλŠ” νŒŒλž€μƒ‰ λ§‰λŒ€(ν•΄μ œλ˜μ§€ μ•Šμ€ λ©”λͺ¨λ¦¬ ν• λ‹Ή)λ₯Ό 톡해 νŠΉμ • μ‚¬μš©μž μƒν˜Έμž‘μš© 쀑 λ°œμƒν•˜λŠ” λˆ„μˆ˜λ₯Ό μ°Ύμ•„λƒ…λ‹ˆλ‹€ [19-21]. * **예방 및 λͺ¨λ²” 사둀** λŒ€κ·œλͺ¨ 객체 μΊμ‹±μ—λŠ” κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ„ λ°©ν•΄ν•˜μ§€ μ•ŠλŠ” `WeakMap`을 μ‚¬μš©ν•˜λŠ” 것이 ꢌμž₯λ©λ‹ˆλ‹€ [12]. React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” μ»΄ν¬λ„ŒνŠΈμ˜ 수λͺ… 주기에 맞좰 `useEffect` λ‚΄μ—μ„œ 항상 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό μ œκ±°ν•˜κ±°λ‚˜ ꡬ독을 μ·¨μ†Œν•˜λŠ” 정리(cleanup) ν•¨μˆ˜λ₯Ό μ œκ³΅ν•˜μ—¬ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό 미연에 λ°©μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€ [10-12]. ## πŸ”— Knowledge Connections - **Related Topics:** [[React Hooks]], [[Performance Optimization]], [[Garbage Collection]] - **Projects/Contexts:** [[Frontend Application Debugging]], [[Scalable React Architecture]] - **Contradictions/Notes:** μ†ŒμŠ€μ˜ λ©”λͺ¨λ¦¬ λˆ„μˆ˜ 디버깅 기법듀은 주둜 Chrome DevToolsλ₯Ό κΈ°μ€€μœΌλ‘œ μ„€λͺ…λ˜λ©°, React κ°œλ°œμžλŠ” Hook의 생λͺ…μ£ΌκΈ°λ₯Ό μ •ν™•νžˆ μ΄ν•΄ν•˜μ—¬ cleanup을 μˆ˜ν–‰ν•˜λŠ” 것이 λ©”λͺ¨λ¦¬ μ΅œμ ν™”μ— 직결됨을 κ°•μ‘°ν•©λ‹ˆλ‹€ [5, 11, 22]. --- *Last updated: 2026-04-26*