# [[Node.js Memory Tuning|Node.js Memory Tuning]] ## πŸ“Œ Brief Summary Node.js λ©”λͺ¨λ¦¬ νŠœλ‹μ€ V8 μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„μ—μ„œ μ‹€ν–‰λ˜λŠ” Node.js μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ λͺ¨λ‹ˆν„°λ§, 관리 및 μ΅œμ ν™”ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€ [1]. 이 νŠœλ‹μ˜ 핡심은 V8이 λ©”λͺ¨λ¦¬λ₯Ό νž™(New Space 및 Old Space)κ³Ό μŠ€νƒμœΌλ‘œ κ΅¬μ„±ν•˜λŠ” 방식과 κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(GC)을 톡해 λ©”λͺ¨λ¦¬λ₯Ό νšŒμˆ˜ν•˜λŠ” 방식을 μ΄ν•΄ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€ [1, 2]. κ°œλ°œμžλŠ” νŠΉμ • λͺ…령쀄 ν”Œλž˜κ·Έλ₯Ό μ‚¬μš©ν•˜μ—¬ νž™ 크기와 GC μ£ΌκΈ°λ₯Ό μ‘°μ •ν•¨μœΌλ‘œμ¨ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€κ³  λ©”λͺ¨λ¦¬ λΆ€μ‘±(Out-of-memory)으둜 μΈν•œ μΆ©λŒμ„ λ°©μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [1, 3-5]. ## πŸ“– Core Content **V8 λ©”λͺ¨λ¦¬ μ•„ν‚€ν…μ²˜μ˜ 이해** * V8은 λ©”λͺ¨λ¦¬λ₯Ό 주둜 **νž™(Heap)**κ³Ό **μŠ€νƒ(Stack)**으둜 λ‚˜λˆ„μ–΄ κ΄€λ¦¬ν•©λ‹ˆλ‹€ [2, 6]. * **μŠ€νƒ(Stack):** 정적 데이터, μ§€μ—­ λ³€μˆ˜, ν•¨μˆ˜ 호좜 정보가 LIFO(Last In, First Out) λ°©μ‹μœΌλ‘œ μ €μž₯λ˜λŠ” μž‘κ³  λΉ λ₯Έ μ˜μ—­μž…λ‹ˆλ‹€ [6]. * **νž™(Heap):** 객체, λ°°μ—΄, ν•¨μˆ˜μ™€ 같은 동적 데이터가 ν• λ‹Ήλ˜λŠ” 큰 μ˜μ—­μ΄λ©°, κ°€λΉ„μ§€ 컬렉터에 μ˜ν•΄ κ΄€λ¦¬λ©λ‹ˆλ‹€ [6, 7]. νž™μ€ λ‹€μ‹œ 단기 생쑴 객체가 μƒμ„±λ˜λŠ” **New Space**(Young Generation)와 μ—¬λŸ¬ 번의 GC μ£ΌκΈ°λ₯Ό 버텨낸 μž₯κΈ° 생쑴 객체가 λ³΄κ΄€λ˜λŠ” **Old Space** λ“±μœΌλ‘œ μ„ΈλΆ„ν™”λ©λ‹ˆλ‹€ [2, 7]. **λ©”λͺ¨λ¦¬ λͺ¨λ‹ˆν„°λ§ 및 λˆ„μˆ˜ 탐지** * λ©”λͺ¨λ¦¬λ₯Ό νŠœλ‹ν•˜κΈ° 전에 `process.memoryUsage()` λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ©”λͺ¨λ¦¬ μ†ŒλΉ„λŸ‰μ„ λͺ¨λ‹ˆν„°λ§ν•΄μ•Ό ν•©λ‹ˆλ‹€ [8, 9]. 이 λ©”μ„œλ“œλŠ” RSS(Resident Set Size), `heapTotal`, `heapUsed`, `external`, `arrayBuffers` λ“±μ˜ λ©”λͺ¨λ¦¬ μ§€ν‘œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€ [9]. * μ‹œκ°„μ΄ μ§€λ‚˜λ„ `heapUsed`κ°€ λ°˜ν™˜λ˜μ§€ μ•Šκ³  μ§€μ†μ μœΌλ‘œ μ¦κ°€ν•œλ‹€λ©΄ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ‹ ν˜ΈμΌ 수 μžˆμŠ΅λ‹ˆλ‹€ [3]. * `--trace-gc` ν”Œλž˜κ·Έλ₯Ό μ‚¬μš©ν•˜λ©΄ Scavenge(New Space GC)와 Mark-sweep(Old Space GC) λ“±μ˜ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ 이벀트λ₯Ό μ½˜μ†”μ—μ„œ μΆ”μ ν•˜μ—¬ λ©”λͺ¨λ¦¬κ°€ ν•΄μ œλ˜λŠ” μƒνƒœμ™€ GC μ†Œμš” μ‹œκ°„μ„ 뢄석할 수 μžˆμŠ΅λ‹ˆλ‹€ [10-12]. **λͺ…령쀄 ν”Œλž˜κ·Έλ₯Ό ν™œμš©ν•œ λ©”λͺ¨λ¦¬ νŠœλ‹** Node.jsλŠ” λ©”λͺ¨λ¦¬ μ΅œμ ν™”λ₯Ό μœ„ν•΄ V8 μ—”μ§„μ˜ λ©”λͺ¨λ¦¬ κ΄€λ ¨ 섀정을 λ―Έμ„Έ μ‘°μ •ν•  수 μžˆλŠ” μ—¬λŸ¬ λͺ…령쀄 ν”Œλž˜κ·Έ(Command-Line Flags)λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€ [3]. * `--max-old-space-size`: V8 νž™μ—μ„œ 수λͺ…이 κΈ΄ 객체듀이 μ €μž₯λ˜λŠ” Old Space의 μ΅œλŒ€ 크기λ₯Ό μ œν•œν•©λ‹ˆλ‹€ [4]. 지속적인 데이터λ₯Ό 많이 μ²˜λ¦¬ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 경우, 이 값을 λŠ˜λ €μ£Όμ–΄(예: `--max-old-space-size=4096`) μž¦μ€ GC둜 μΈν•œ 응닡 속도 μ €ν•˜λ‚˜ μΆ©λŒμ„ λ°©μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [4, 13]. * `--max-semi-space-size`: 객체가 처음 ν• λ‹Ήλ˜λŠ” New Space의 크기λ₯Ό μ‘°μ ˆν•©λ‹ˆλ‹€ [13]. μ΄ˆλ‹Ή μš”μ²­ μˆ˜κ°€ λ§Žμ•„ μž‘μ€ 객체가 μˆ˜μ—†μ΄ μƒμ„±λ˜λŠ” ν™˜κ²½μ—μ„œ 이 값을 늘리면(예: `--max-semi-space-size=64`), λ§ˆμ΄λ„ˆ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ˜ λΉˆλ„λ₯Ό 쀄여 μ „λ°˜μ μΈ μ„±λŠ₯ μ €ν•˜λ₯Ό 막을 수 μžˆμŠ΅λ‹ˆλ‹€ [5, 13]. * `--gc-interval`: κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ΄ μ‹œλ„λ˜λŠ” μ£ΌκΈ°λ₯Ό μ‘°μ •ν•©λ‹ˆλ‹€ [5]. μ‹€μ‹œκ°„ 처리 λ“± νŠΉμ • μ‘°κ±΄μ—μ„œ GC의 μ£ΌκΈ°λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ œμ–΄ν•  ν•„μš”κ°€ μžˆμ„ λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€(예: `--gc-interval=100`) [5, 14]. * `--expose-gc`: μ½”λ“œ λ‚΄λΆ€μ—μ„œ `global.gc()`λ₯Ό ν˜ΈμΆœν•˜μ—¬ κ°œλ°œμžκ°€ μˆ˜λ™μœΌλ‘œ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ„ μ‹€ν–‰ν•  수 μžˆλ„λ‘ ν—ˆμš©ν•˜λŠ” ν”Œλž˜κ·Έμž…λ‹ˆλ‹€ [14, 15]. ## πŸ”— Knowledge Connections - **Related Topics:** [[V8 JavaScript Engine|V8 JavaScript Engine]], [[Garbage Collection|Garbage Collection]], [[α„’α…΅α†Έ 메모라(Heap Memory)|Heap Memory]], [[Memory Leaks|Memory Leaks]] - **Projects/Contexts:** Node.js Production Profiling, [[Performance Optimization|Performance Optimization]] - **Contradictions/Notes:** `--expose-gc` ν”Œλž˜κ·Έλ₯Ό 톡해 μˆ˜λ™μœΌλ‘œ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ„ μ‹€ν–‰ν•˜λ”λΌλ„, V8의 일반적인 μžλ™ GC μ•Œκ³ λ¦¬μ¦˜μ΄ λΉ„ν™œμ„±ν™”λ˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. μˆ˜λ™ ν˜ΈμΆœμ„ κ³Όλ„ν•˜κ²Œ μ‚¬μš©ν•˜λ©΄ 였히렀 μ„±λŠ₯에 뢀정적인 영ν–₯을 λ―ΈμΉ  수 μžˆμœΌλ―€λ‘œ μ£Όμ˜κ°€ ν•„μš”ν•©λ‹ˆλ‹€ [15]. λ˜ν•œ, `--gc-interval`의 간격을 λ„ˆλ¬΄ 짧게 μ„€μ •ν•  경우 μž¦μ€ GC μˆ˜ν–‰μœΌλ‘œ 인해 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯ μ €ν•˜λ₯Ό μœ λ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€ [14]. --- *Last updated: 2026-04-19*