Node.js'te bellek sızıntısını (memory leak) nasıl tespit edip düzeltirsiniz?

Cevap

Belirti genelde şudur: process'in heap kullanımı trafik sabitken bile sürekli artar, GC süreleri uzar, sonunda FATAL ERROR: Reached heap limit ile çöker veya container OOMKilled olur.

Tespit adımları

  1. Metrikleri izleyin: process.memoryUsage() (heapUsed, rss, external) veya Prometheus prom-client varsayılan metrikleri. Testere dişi desen normaldir; tabanın sürekli yükselmesi sızıntıdır.
  2. Heap snapshot alın: belirli aralıklarla 2-3 snapshot alıp karşılaştırın.
node --inspect app.js          # Chrome DevTools -> Memory sekmesi
node --heapsnapshot-signal=SIGUSR2 app.js
kill -USR2 <pid>               # çalışan process'ten snapshot
import v8 from "node:v8";
v8.writeHeapSnapshot();        // programatik
  1. Snapshot'lar arası Comparison görünümünde sürekli artan nesne tipine ve retainer zincirine (onu kimin tuttuğuna) bakın.
  2. Araçlar: Chrome DevTools, clinic heapprofiler, APM'lerin heap profiling özellikleri.

Yaygın sebepler

// 1) Sınırsız büyüyen in-memory cache
const cache = new Map();
app.get("/user/:id", async (req, res) => {
  cache.set(req.params.id, await loadUser(req.params.id)); // hiç silinmiyor
});
  • Global/modül seviyesinde biriken diziler ve Map'ler. Çözüm: lru-cache gibi boyut ve TTL sınırlı cache.
  • Kaldırılmayan event listener'lar (emitter.on her istekte eklenip off yapılmıyor). Node MaxListenersExceededWarning ile uyarır.
  • Temizlenmeyen setInterval ve timer'lar.
  • Büyük nesneleri yakalayan closure'lar.
  • Hiç resolve olmayan, sonsuza kadar bekleyen promise'ler ve kapatılmayan stream'ler.

Geçici önlemler

--max-old-space-size heap limitini container belleğiyle uyumlu hale getirir ama sızıntıyı çözmez; yalnızca çökmeyi geciktirir. Kalıcı çözüm retainer zincirindeki referansı koparmaktır.

  1. cluster modülü ile worker_threads arasındaki fark nedir? Hangisini ne zaman kullanırsınız?ZorNode.jsBackend
  2. Node.js event loop'u nasıl çalışır? libuv'nin rolü ve event loop aşamaları nelerdir?ZorNode.jsBackend
  3. Node.js'te asenkron kodda hata yönetimi nasıl yapılır? unhandledRejection nedir?OrtaNode.jsBackend
  4. Node.js'te stream nedir? Türleri nelerdir ve backpressure ne demektir?OrtaNode.jsBackend
  5. process.nextTick, Promise.then, setImmediate ve setTimeout(fn, 0) hangi sırayla çalışır?OrtaNode.jsBackend
  6. Express.js'te middleware nedir ve nasıl çalışır?KolayNode.jsBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle