--- category: Unified tags: [auto-consolidated, technical-documentation] title: [[Memory Leaks|Memory Leaks]] last_updated: 2026-05-02 --- # [[Memory Leaks|Memory Leaks]] ## πŸ“Œ Brief Summary > Three.js 및 [[WebGL|WebGL]] ν™˜κ²½μ—μ„œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜(Memory Leaks)λŠ” GPU λ¦¬μ†ŒμŠ€κ°€ μžλ™μœΌλ‘œ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜([[Garbage Collection|Garbage Collection]])λ˜μ§€ μ•Šμ•„ VRAM λ“± λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ μ§€μ†μ μœΌλ‘œ μ¦κ°€ν•˜λŠ” ν˜„μƒμ„ μ˜λ―Έν•©λ‹ˆλ‹€ [1]. μ΄λŠ” 주둜 μ§€μ˜€λ©”νŠΈλ¦¬, 재질, ν…μŠ€μ²˜ λ“±μ˜ λ Œλ”λ§ λ¦¬μ†ŒμŠ€λ₯Ό μ½”λ“œ μƒμ—μ„œ λͺ…μ‹œμ μœΌλ‘œ ν•΄μ œν•˜μ§€ μ•Šμ•˜μ„ λ•Œ λ°œμƒν•©λ‹ˆλ‹€ [1, 2]. λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό λ°©μ§€ν•˜λ €λ©΄ λ Œλ”λŸ¬ 정보λ₯Ό ν†΅ν•œ 지속적인 λͺ¨λ‹ˆν„°λ§κ³Ό μ˜¬λ°”λ₯Έ λ©”λͺ¨λ¦¬ 관리 κΈ°λ²•μ˜ 적용이 ν•„μˆ˜μ μž…λ‹ˆλ‹€ [2]. --- > κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ ν™˜κ²½μ—μ„œμ˜ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λŠ” κ°œλ°œμžκ°€ 더 이상 ν•„μš”λ‘œ ν•˜μ§€ μ•ŠλŠ” 객체듀이 κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(GC) λ£¨νŠΈλ‘œλΆ€ν„° μ—¬μ „νžˆ 참쑰되고 μžˆμ–΄ λ©”λͺ¨λ¦¬κ°€ ν•΄μ œλ˜μ§€ μ•ŠλŠ” ν˜„μƒμ„ μ˜λ―Έν•œλ‹€ [1-4]. μ΄λŸ¬ν•œ ν˜„μƒμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ μ μ§„μ μœΌλ‘œ μ¦κ°€μ‹œν‚€λ©°, 결과적으둜 μž¦μ€ GC 싀행에 λ”°λ₯Έ μ„±λŠ₯ μ €ν•˜μ™€ λ©”λͺ¨λ¦¬ λΆ€μ‘±(OOM) ν¬λž˜μ‹œλ₯Ό μœ λ°œν•œλ‹€ [5, 6]. 일반적인 λ©”λͺ¨λ¦¬ μœ μ‹€κ³Ό 달리, μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œμ˜ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λŠ” 기본적으둜 μ½”λ“œ μ–΄λ”˜κ°€μ— λ‚¨μ•„μžˆλŠ” μ›μΉ˜ μ•ŠλŠ” μ°Έμ‘° λ•Œλ¬Έμ— λ°œμƒν•œλ‹€ [1, 4]. ## πŸ“– Core Content * **GPU λ¦¬μ†ŒμŠ€μ˜ μˆ˜λ™ ν•΄μ œ:** Three.jsλŠ” GPU λ¦¬μ†ŒμŠ€λ₯Ό μžλ™μœΌλ‘œ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, 더 이상 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μžμ›μ€ λ°˜λ“œμ‹œ κ°œλ°œμžκ°€ 직접 **`geometry.dispose()`, `material.dispose()`, `texture.dispose()`, `renderTarget.dispose()`**λ₯Ό ν˜ΈμΆœν•˜μ—¬ ν•΄μ œν•΄μ•Ό ν•©λ‹ˆλ‹€ [1-3]. * **GLTF ImageBitmap 특수 처리:** GLTF λͺ¨λΈμ—μ„œ 뢈러온 ν…μŠ€μ²˜λŠ” `ImageBitmap` 객체둜 λ‘œλ“œλ˜λ―€λ‘œ λˆ„μˆ˜λ₯Ό 막기 μœ„ν•œ 좔가적인 μ²˜λ¦¬κ°€ ν•„μš”ν•©λ‹ˆλ‹€ [3]. μ΄λŸ¬ν•œ ν…μŠ€μ²˜λŠ” 일반적인 `dispose()` 외에도 λ°˜λ“œμ‹œ **`texture.source.data.close?.()`**λ₯Ό ν˜ΈμΆœν•˜μ—¬ λͺ…μ‹œμ μœΌλ‘œ λ‹«μ•„μ£Όμ–΄μ•Ό ImageBitmap 객체의 λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό 막을 수 μžˆμŠ΅λ‹ˆλ‹€ [2, 3]. * **였브젝트 풀링(Object [[Pooling|Pooling]]) λ„μž…:** λŸ°νƒ€μž„ 쀑 λΉˆλ²ˆν•˜κ²Œ μƒμ„±λ˜κ³  νŒŒκ΄΄λ˜λŠ” 였브젝트(예: μ΄μ•Œ, νŒŒν‹°ν΄, 적 λ“±)λŠ” λ©”λͺ¨λ¦¬ ν• λ‹Ή μ˜€λ²„ν—€λ“œμ™€ 이둜 μΈν•œ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ μ§€μ—°(GC pauses)을 μœ λ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€ [3]. 이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ μƒˆλ‘œμš΄ 객체λ₯Ό 맀번 ν• λ‹Ήν•˜λŠ” λŒ€μ‹  κΈ°μ‘΄ 객체λ₯Ό μž¬ν™œμš©ν•˜λŠ” **객체 풀링([[Object Pooling|Object Pooling]])** νŒ¨ν„΄μ„ κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€ [2, 3]. * **λ©”λͺ¨λ¦¬ λˆ„μˆ˜ λͺ¨λ‹ˆν„°λ§:** λŸ°νƒ€μž„μ— λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λ°œμƒν•˜κ³  μžˆλŠ”μ§€ ν™•μΈν•˜λ €λ©΄ **`renderer.info.memory`** μ§€ν‘œλ₯Ό 주기적으둜 λͺ¨λ‹ˆν„°λ§ν•΄μ•Ό ν•©λ‹ˆλ‹€ [1, 2]. ν•΄λ‹Ή μ§€ν‘œμ—μ„œ μ§€μ˜€λ©”νŠΈλ¦¬μ™€ ν…μŠ€μ²˜μ˜ μΉ΄μš΄νŠΈκ°€ λ–¨μ–΄μ§€μ§€ μ•Šκ³  κ³„μ†ν•΄μ„œ μƒμŠΉν•˜κΈ°λ§Œ ν•œλ‹€λ©΄, λͺ…ν™•ν•œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ‘œ νŒλ‹¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [1, 2]. * **에셋 슀트리밍(Asset Streaming) 및 λ©”λͺ¨λ¦¬ ν•œκ³„:** WebGL μ»¨ν…μŠ€νŠΈλŠ” μ œν•œλœ λ©”λͺ¨λ¦¬ μš©λŸ‰(톡상 256MB~1GB)을 μ§€λ‹ˆκ³  μžˆμ–΄ 이λ₯Ό μ΄ˆκ³Όν•˜λ©΄ λΈŒλΌμš°μ € ν¬λž˜μ‹œλ‚˜ 프리징이 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€ [4]. λ¬΄ν•œν•œ 크기의 씬이라도 μΉ΄λ©”λΌμ—μ„œ 100 μœ λ‹› 이상 λ©€μ–΄μ§„ μžμ›λ“€μ— λŒ€ν•΄ `dispose()`λ₯Ό ν˜ΈμΆœν•΄ λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•˜λŠ” 슀트리밍 방식을 μ μš©ν•˜λ©΄, ν™œμ„±ν™”λœ λͺ¨λΈλ§Œ λ©”λͺ¨λ¦¬μ— μœ μ§€ν•˜μ—¬ λ©”λͺ¨λ¦¬ λˆ„μˆ˜ 및 κ³ κ°ˆμ„ λ°©μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [5]. --- * **λ°œμƒ λ©”μ»€λ‹ˆμ¦˜:** V8 μ—”μ§„κ³Ό 같은 λŸ°νƒ€μž„ ν™˜κ²½μ—μ„œ κ°μ²΄λŠ” κΈ€λ‘œλ²Œ 객체, ν™œμ„± ν΄λ‘œμ €, 이벀트 λ¦¬μŠ€λ„ˆ, 타이머 λ“±μœΌλ‘œλΆ€ν„° 도달 κ°€λŠ₯(reachable)ν•œ μƒνƒœμΌ λ•Œ λ©”λͺ¨λ¦¬μ— μœ μ§€λœλ‹€ [1, 4]. 이 μ—°κ²° 고리λ₯Ό λŠμ§€ μ•ŠμœΌλ©΄ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œκ°„μ΄ κΈΈμ–΄μ§ˆμˆ˜λ‘ νž™(Heap) λ©”λͺ¨λ¦¬κ°€ ν•΄μ œλ˜μ§€ μ•Šκ³  계단식(Ratchet)으둜 μƒμŠΉν•˜λŠ” νŒ¨ν„΄μ„ 보인닀 [7, 8]. 특히 수λͺ…이 κΈ΄ 객체듀이 λͺ¨μ΄λŠ” V8의 '[[Old Space|Old Space]]' μ˜μ—­ μ‚¬μš©λŸ‰μ΄ [[Major GC|Major GC]] 이후에도 μ§€μ†μ μœΌλ‘œ μ¦κ°€ν•œλ‹€λ©΄ λ©”λͺ¨λ¦¬ λˆ„μˆ˜μΌ ν™•λ₯ μ΄ 맀우 λ†’λ‹€ [9, 10]. * **μ£Όμš” λˆ„μˆ˜ νŒ¨ν„΄:** μ†ŒμŠ€μ— λ”°λ₯΄λ©΄ λ‹€μŒκ³Ό 같은 μƒν™©μ—μ„œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λΉˆλ²ˆν•˜κ²Œ λ°œμƒν•œλ‹€. * **이벀트 λ¦¬μŠ€λ„ˆ 및 타이머 좕적:** λ Œλ”λ§ μ£ΌκΈ°λ‚˜ μΈν„°λ²Œ μ½œλ°±μ—μ„œ μΆ”κ°€λœ λ¦¬μŠ€λ„ˆ 및 타이머(setInterval λ“±)λ₯Ό 적절히 μ œκ±°ν•˜μ§€ μ•ŠμœΌλ©΄, ν•΄λ‹Ή 콜백의 ν΄λ‘œμ €μ™€ 참쑰된 객체듀이 λ¬΄κΈ°ν•œ λ©”λͺ¨λ¦¬μ— λ‚¨κ²Œ λœλ‹€ [11-14]. Node.js ν™˜κ²½μ—μ„œ 단일 μ΄λ²€νŠΈμ— 10개 μ΄μƒμ˜ λ¦¬μŠ€λ„ˆκ°€ 좔가될 λ•Œ λ°œμƒν•˜λŠ” `MaxListenersExceededWarning` κ²½κ³ λŠ” λˆ„μˆ˜ λ°œμƒμ„ ν™•μΈν•˜λŠ” λͺ…ν™•ν•œ μ§€ν‘œμ΄λ‹€ [15]. * **ν΄λ‘œμ € μŠ€μ½”ν”„ 보쑴:** μ—¬λŸ¬ ν΄λ‘œμ €κ°€ ν•˜λ‚˜μ˜ μŠ€μ½”ν”„λ₯Ό κ³΅μœ ν•˜λŠ” 경우, 단 ν•˜λ‚˜μ˜ ν΄λ‘œμ €λΌλ„ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜μ—¬ ν™œμ„± μƒνƒœλ₯Ό μœ μ§€ν•˜λ©΄ 동일 μŠ€μ½”ν”„ λ‚΄μ—μ„œ 캑처된 λ‹€λ₯Έ λŒ€μš©λŸ‰ 객체듀도 λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œλ˜μ§€ λͺ»ν•œλ‹€ [11, 15]. * **λΆ„λ¦¬λœ DOM λ…Έλ“œ:** DOM νŠΈλ¦¬μ—μ„œλŠ” μ œκ±°λ˜μ—ˆμœΌλ‚˜ [[JavaScript|JavaScript]] λ³€μˆ˜λ‚˜ Map/Set 등에 μ˜ν•΄ μ°Έμ‘°λ₯Ό μœ μ§€ν•˜κ³  μžˆλŠ” DOM μš”μ†ŒλŠ” ν•΄λ‹Ή μš”μ†Œκ°€ ν¬ν•¨λœ 전체 μ„œλΈŒνŠΈλ¦¬μ˜ λ©”λͺ¨λ¦¬λ₯Ό μ§€μ†μ μœΌλ‘œ μ μœ ν•œλ‹€ [16, 17]. * **λ¬΄μ œν•œ μΊμ‹œ 및 라우트 μ „ν™˜:** 크기 μ œν•œμ΄ μ—†λŠ” μΊμ‹œ 데이터, ν˜Ήμ€ SPA(Single Page Application)μ—μ„œ 이전 라우트의 μ»΄ν¬λ„ŒνŠΈκ°€ μ „μ—­ μƒνƒœ μ°Έμ‘°λ‚˜ λ¦¬μŠ€λ„ˆλ₯Ό μ •λ¦¬ν•˜μ§€ λͺ»ν•˜λŠ” 것도 μ£Όμš” λˆ„μˆ˜ 원인이닀 [15, 18]. * **μž˜λΌλ‚Έ λ¬Έμžμ—΄(Sliced String):** κ±°λŒ€ν•œ λ¬Έμžμ—΄μ˜ 일뢀뢄을 `substring()` λ“±μœΌλ‘œ 잘라 μ „μ—­ λ³€μˆ˜μ— 보관할 경우, μž˜λΌλ‚Έ λ¬Έμžμ—΄μ΄ 원본 λ¬Έμžμ—΄μ˜ 포인터λ₯Ό μœ μ§€ν•˜λ―€λ‘œ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 원본 λ¬Έμžμ—΄ 전체가 λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œλ˜μ§€ λͺ»ν•  수 μžˆλ‹€ [19]. * **진단 및 ν”„λ‘œνŒŒμΌλ§ 도ꡬ:** * [[Chrome DevTools|Chrome DevTools]]의 'νž™ μŠ€λƒ…μƒ·(Heap Snapshots)'κ³Ό 'ν• λ‹Ή νƒ€μž„λΌμΈ([[Allocation Timeline|Allocation Timeline]])'을 ν™œμš©ν•˜μ—¬ λˆ„μˆ˜λ₯Ό μ§„λ‹¨ν•œλ‹€ [20-23]. * νŠΉμ • λ™μž‘μ„ μˆ˜ν–‰ν•˜κΈ° μ „ν›„λ‘œ μ—¬λŸ¬ 번 μŠ€λƒ…μƒ·μ„ 찍어 λΉ„κ΅ν•˜λŠ” '3-μŠ€λƒ…μƒ· 기법'을 톡해, μ˜λ„μΉ˜ μ•Šκ²Œ λ‚¨μ•„μžˆλŠ” 객체λ₯Ό 효과적으둜 식별할 수 μžˆλ‹€ [20, 24]. νƒ€μž„λΌμΈμ— λ‚˜νƒ€λ‚˜λŠ” νŒŒλž€μƒ‰ λ§‰λŒ€λŠ” ν• λ‹Ή ν›„ ν•΄μ œλ˜μ§€ μ•Šμ€ μ‚΄μ•„μžˆλŠ” λ©”λͺ¨λ¦¬λ₯Ό μ˜λ―Έν•˜λ©°, 이λ₯Ό 톡해 잠재적인 λˆ„μˆ˜ 지점을 νŒŒμ•…ν•œλ‹€ [23, 25, 26]. * μ˜μ‹¬λ˜λŠ” 객체λ₯Ό μ°Ύμ•˜λ‹€λ©΄ DevTools의 'Retainers' νŒ¨λ„μ„ 톡해 ν•΄λ‹Ή 객체가 μ–΄λ–€ μ°Έμ‘° 경둜([[Retaining Path|Retaining Path]])λ₯Ό 거쳐 GC λ£¨νŠΈμ— μ—°κ²°λ˜μ–΄ μžˆλŠ”μ§€ μ—­μΆ”μ ν•˜μ—¬ 원인을 νŒŒμ•…ν•  수 μžˆλ‹€ [27-29]. * λ˜ν•œ `--trace-gc` ν”Œλž˜κ·Έ, `heapdump`, `clinic.js` 같은 도ꡬλ₯Ό μ‚¬μš©ν•˜μ—¬ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ λ™μž‘κ³Ό λ©”λͺ¨λ¦¬ 증가 μΆ”μ„Έλ₯Ό λͺ¨λ‹ˆν„°λ§ν•  수 μžˆλ‹€ [7, 13, 30, 31]. ## βš–οΈ Trade-offs & Caveats - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Graphics & Performance λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. --- - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— Knowledge Connections - **Related Topics:** [[Garbage Collection|Garbage Collection]], [[Object Pooling|Object Pooling]], Dispose(), ImageBitmap - **Projects/Contexts:** Three.js Memory [[Management|Management]], Asset Streaming in WebGL - **Contradictions/Notes:** μ†ŒμŠ€ κ°„μ˜ λͺ¨μˆœμ μ€ λ°œκ²¬λ˜μ§€ μ•Šμ•˜μœΌλ©°, 제곡된 μ†ŒμŠ€λ“€μ€ λͺ¨λ‘ κ³΅ν†΅μ μœΌλ‘œ Three.js μ—”μ§„ ν™˜κ²½μ—μ„œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ 'μ‚¬μš©μ΄ λλ‚œ μžμ›μ˜ λͺ…μ‹œμ  ν•΄μ œ(dispose)'κ°€ μ ˆλŒ€μ μœΌλ‘œ ν•„μš”ν•¨μ„ κ°•μ‘°ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. --- *Last updated: 2026-04-19* --- --- - **Related Topics:** κ°€λΉ„μ§€ μ»¬λ ‰μ…˜([[Garbage Collection|Garbage Collection]]), [[V8 Heap Architecture|V8 Heap Architecture]], νž™ μŠ€λƒ…μƒ·(Heap Snapshot), ν΄λ‘œμ €(Closure) - **Projects/Contexts:** Node.js Memory Leaks in Production, [[Browser|Browser]] Memory Leak Detection - **Contradictions/Notes:** C/C++ ν”„λ‘œκ·Έλž¨ 등에 μ‚¬μš©λ˜λŠ” 컴파일러 지원이 μ—†λŠ” 보수적(Conservative) κ°€λΉ„μ§€ μ»¬λ ‰ν„°μ˜ 경우, ν¬μΈν„°μ²˜λŸΌ λ³΄μ΄λŠ” 일반 μ •μˆ˜ λ°μ΄ν„°λ‘œ 인해 κ±°λŒ€ν•œ 객체 μ„œλΈŒκ·Έλž˜ν”„κ°€ μœ μ§€λ˜λŠ” λ…νŠΉν•œ ν˜•νƒœμ˜ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό μœ λ°œν•  κ°€λŠ₯성이 μ‘΄μž¬ν•œλ‹€κ³  μ†ŒμŠ€μ—μ„œ μ§€μ ν•œλ‹€ [32]. λ˜ν•œ ν”„λ‘ νŠΈμ—”λ“œ μ΅œμ‹  도ꡬ인 `WeakRef`와 `FinalizationRegistry`λ₯Ό μ‚¬μš©ν•΄ λˆ„μˆ˜μ— κ°•ν•œ νŒ¨ν„΄μ„ μž‘μ„±ν•  수 μžˆμœΌλ‚˜, κ°€λΉ„μ§€ μ»¬λ ‰ν„°λŠ” 자체 일정에 따라 μ‹€ν–‰λ˜μ–΄ 결정둠적이지 μ•ŠμœΌλ―€λ‘œ μ μ ˆν•œ 객체 수λͺ… μ£ΌκΈ° 관리λ₯Ό μ™„λ²½νžˆ λŒ€μ²΄ν•  μˆ˜λŠ” μ—†μŒμ— μœ μ˜ν•΄μ•Ό ν•œλ‹€ [12]. --- *Last updated: 2026-04-19* ---