Node.js 效能優化與記憶體分析重點
📌 1. 效能瓶頸常見來源
類型 | 範例 |
---|---|
❌ 同步阻塞 | 大型排序、同步 I/O |
❌ 記憶體洩漏 | 未釋放 closure、全域變數、過大快取 |
❌ 頻繁 GC | 太多短命物件或大物件 |
❌ 事件迴圈卡住 | 長時間執行的 callback |
❌ thread pool 滿載 | 同時大量 fs/crypto 非同步任務 |
📌 2. 效能優化原則
- 避免同步函式(如 fs.readFileSync())
- 拆解 CPU 密集任務(改用 Worker Thread 或外部服務)
- 減少 GC 壓力(重複利用物件、避免產生短命大物件)
- 避免記憶體洩漏(解除不必要的閉 包、監控物件數量)
- 限制 thread pool 負載(合理分配非同步任務)
📌 3. 記憶體管理與垃圾回收(GC)
Node.js 使用 V8 記憶體模型:
區段 | 用途 |
---|---|
New Space | 小型、短生命週期的物件(快 GC) |
Old Space | 大型、長壽命物件(慢 GC) |
Code Space | 儲存已編譯的程式碼 |
Large Object Space | 大於固定大小的物件 |
Map Space | 儲存內部元資料 |
垃圾回收策略:
- Scavenge:處理 New Space(快速)
- Mark-Sweep / Mark-Compact:處理 Old Space(較慢,會造成延遲)
✅ 若物件從 New Space 活太久,會被提升到 Old Space。
📌 4. 提升效能的實務策略
✅ 減少 I/O 阻塞:
- 改用非同步函式 (fs.promises)
- 使用快取層(如 Redis)