Bu senaryo çoğu yazılımcının kabusu olabilir. Ama endişelenmeyin! Bu yazıda, Node.js’te karşılaşılan ‘Memory Leak Warning’ hatasını anlayacak ve bu hatadan nasıl kurtulabileceğinizi öğreneceksiniz.
Memory Leak Nedir?
Node.js, tek iş parçacıklı bir yapıya sahip olduğundan, bellek sızıntıları daha hızlı bir şekilde hissedilebilir. Çünkü her işlem aynı iş parçacığında çalıştığı için, belleğin verimli kullanılması son derece kritik hale gelir.
Memory Leak Warning Hatası ile Karşılaşıldığında Ne Yapmalıyız?
```
<--- Last few GCs --->
[12345:123456] 12345 ms: Mark-sweep 12345.0 (1234560) -> 12345.0 (1234550) MB, 2.0 / 0.0 ms (average mu = 0.123456) low memory notification GC in old space requested
<--- JS stacktrace --->
...
```
Bu uyarı, Node.js’in bellek yönetiminde bir problem yaşadığını ve bellek kullanımı ile ilgili bir durum tespit ettiğini gösterir. Bu noktada çözüm için aşağıdaki adımları takip edebilirsiniz.
1. Bellek Sızıntılarını Tespit Etmek
const heapdump = require('heapdump');
// Belirli bir noktada heap dump alalım
heapdump.writeSnapshot('./' + Date.now() + '.heapsnapshot');
Bu kod, bellek kullanımını izlemek için bir *heapsnapshot* alır. Bu dosya, belleğin nasıl kullanıldığını ve nerelerde sızıntılar olabileceğini anlamanıza yardımcı olur. Chrome Developer Tools ile bu dosyayı inceleyebilirsiniz.
2. Profil Alma ve Performans İzleme
const profiler = require('v8-profiler');
// Profil başlatma
profiler.startProfiling('my-app');
// Belirli bir süre sonra profil kaydını al
setTimeout(() => {
const profile = profiler.stopProfiling('my-app');
profile.export((error, result) => {
if (error) {
console.error('Profil alırken hata oluştu:', error);
} else {
console.log('Profil kaydı:', result);
}
});
}, 5000);
Bu kod, belirli bir süre boyunca uygulamanızı izler ve ardından profil verilerini alır. Bu sayede uygulamanızdaki bellek tüketimini ve potansiyel bellek sızıntılarını tespit edebilirsiniz.
3. Bellek Sızıntısını Önlemek İçin İyi Pratikler
- Belleği doğru yönetmek: Özellikle büyük veri yapılarını veya objeleri gereksiz yere bellekte tutmaktan kaçının. Gereksiz verileri serbest bırakın.
- Event Listener'ları doğru yönetmek: Event listener’ları doğru şekilde temizlememek, bellek sızıntılarının başlıca sebeplerindendir. Event listener’ları her zaman `removeListener()` ile temizleyin.
- Global Değişkenlerden Kaçınmak: Global değişkenler, belleği gereksiz yere kullanabilir. Mümkün olduğunda, fonksiyonlarda veya sınıflarda yerel değişkenler kullanmaya özen gösterin.
- Sürekli İzleme: Uygulamanızın bellek kullanımını düzenli aralıklarla izleyin. Node.js için kullanılan PM2 veya New Relic gibi araçlar sayesinde gerçek zamanlı olarak bellek kullanımınızı takip edebilirsiniz.
4. Çözüm Sonrası Test ve İzleme
Testlerinizi düzenli yaparak, ileride karşılaşabileceğiniz olası bellek sızıntılarını erken tespit edebilirsiniz.