Bellek Sızıntısı Nedir?
"Memory leak detected. Increase heap limit."
İşte bu, bellek sızıntısının bir işareti! Bellek sızıntısı, uygulamanın kullandığı bellek miktarının, kullanılmadığı halde serbest bırakılmamasıyla meydana gelir. Node.js uygulamanız, bellek sınırlarını aşarak yavaşlamaya, hatta çökmeye başlayabilir. Ancak, doğru araçlarla ve tekniklerle bu sorunu çözmek mümkün.
Memory Leak Warning Hatasının Nedenleri
2. Kapalı Olmayan Bağlantılar: Veritabanı bağlantıları, dosya okuma/yazma işlemleri ve API istekleri gibi dış kaynaklara yapılan bağlantılar da sızıntı yaratabilir. Bağlantı kapatılmadığı sürece, kaynaklar serbest bırakılmaz.
3. Büyük Veri Yapıları: Eğer uygulamanızda çok büyük veri yapıları kullanıyorsanız ve bu yapılar gereksiz yere bellekte tutuluyorsa, bu da bir başka bellek sızıntısı sebebi olabilir.
4. Zamanlayıcılar ve Olay Dinleyiciler: Kullanılmayan zamanlayıcılar (setTimeout, setInterval) veya event listener’lar (on, addEventListener) doğru şekilde temizlenmediğinde de bellek sızıntısı oluşabilir.
Memory Leak Warning Hatasını Tespit Etmek
1. Profiling Yapmak: Node.js, bellek sızıntılarını tespit etmek için yerleşik bir profiler aracına sahiptir. Bu araç, kodunuzun hangi kısmının ne kadar bellek kullandığını gösterir. Ayrıca, kullanmadığınız bellek kaynaklarını nasıl temizlemeniz gerektiğini anlamanızı sağlar.
2. “--inspect” Bayrağını Kullanmak: Node.js uygulamanızda bellek sızıntısını bulmak için `--inspect` bayrağını kullanarak Chrome DevTools’u açabilirsiniz. Bu, uygulamanızın bellek kullanımını izlemenize yardımcı olur.
node --inspect app.js
Bu komut, Chrome'da açık olan DevTools'u kullanarak belleğinizi izleyebilmenizi sağlar. “Memory” sekmesinde, heap ve stack grafiklerini görebilir ve bellek kullanımındaki anormallikleri tespit edebilirsiniz.
Bellek Sızıntısını Çözmek
1. Küresel Değişkenleri Kontrol Edin: Global değişkenler, bir nesne veya veri bellekte tutulduğu sürece çöp toplayıcı (garbage collector) tarafından serbest bırakılmaz. Kodunuzu gözden geçirin ve global değişkenlerden kaçının.
2. Bağlantıları Kapatın: Veritabanı, API bağlantıları ya da dosya sistemine yapılan her türlü işlem, işlem tamamlandığında kapatılmalıdır. Aksi takdirde bu kaynaklar kullanılamaz ve belleği işgal eder.
3. Zamanlayıcıları Temizleyin: Kullanmadığınız `setTimeout` ve `setInterval` zamanlayıcılarını temizlemek önemlidir. Aksi takdirde bu zamanlayıcılar, uygulamanızın her çalışmasında belleği işgal eder.
// setInterval ile zamanlayıcı başlatılıyor
const timer = setInterval(() => {
console.log('Bu bir zamanlayıcıdır.');
}, 1000);
// setInterval'ı temizleyin
clearInterval(timer);
4. Event Listener’ları Kaldırın: Eğer event listener kullanıyorsanız, kullanmadığınız dinleyicileri temizlemeyi unutmayın. Bu, bellek sızıntısını engellemek için önemlidir.
5. Çöp Toplayıcıyı Zorlayın: Node.js'te çöp toplama işlemi otomatik olarak yapılır, ancak bazı durumlarda bunu manuel olarak tetiklemek faydalı olabilir. Bu, özellikle yüksek bellek kullanımını izlerken işe yarar.
// Çöp toplama işlemini zorla
global.gc();
Sonuç: Bellek Sızıntısını Önlemek İçin Sürekli İzleme
Unutmayın, yazılım geliştirme süreci bir yolculuktur ve bellek yönetimi de bu yolculuğun önemli bir parçasıdır. Her zaman daha iyi kod yazma ve verimli çalışma yolları arayın!