Memory Leak Nedir?
Node.js’te memory leak warning hatası genellikle şöyle görünür:
```
<--- Last few GCs --->
[1:0x8f53a40] 1365 ms: Scavenge 1024.5 (1054.0) -> 1024.5 (1054.0) MB, 0.3 / 0.0 ms (average mu = 0.014, current mu = 0.004) allocation failure
```
Bu hatayı alıyorsanız, uygulamanızda bir şeyler yolunda gitmiyor demektir. Geliştirdiğiniz yazılımın bir yerinde gereksiz veriler bellekte tutuluyor ve zamanla bu durum sistemin performansını düşürmeye başlıyor.
Bellek Sızıntıları Nerede Meydana Gelir?
- Event Listener’lar: Eğer bir event listener, beklenmedik şekilde uzun süre bellekte kalırsa, bu bellek sızıntısına yol açabilir.
- Global değişkenler: Global değişkenler, JavaScript’te yaygın bir hata kaynağıdır. Bir değişken global olarak tutulduğunda, her seferinde kullanılmadığı hâlde bellekte kalır.
- Zamanlayıcılar: setInterval veya setTimeout gibi zamanlayıcılar, doğru şekilde temizlenmediklerinde bellekte yer kaplar.
- Yığın Veri Yapıları: Özellikle çok büyük veri koleksiyonları, bellekte gereksiz yere tutulduğu zaman sızıntı oluşturabilir.
Memory Leak Hatasını Nasıl Tespit Edersiniz?
- Node.js Profiler: Node.js’in kendi profiler’ını kullanarak, uygulamanızın bellek kullanımını gözlemleyebilirsiniz.
- Chrome DevTools: Node.js, Chrome DevTools ile entegre çalışabilir. Böylece belleğinizi izleyebilir ve sızıntıları tespit edebilirsiniz.
- Heapdump: Bu kütüphane, uygulamanızın bellek yığını hakkında detaylı bilgi sağlar.
Aşağıda, Chrome DevTools kullanarak bir bellek sızıntısını nasıl tespit edebileceğinizi gösteren bir örnek kod bulunmaktadır:
// Heapdump ile bellek analizi
const heapdump = require('heapdump');
let object1 = {};
let object2 = {};
setInterval(() => {
object1 = object2;
object2 = {}; // object2'yi sürekli olarak değiştirdiğimizde
}, 1000);
// Bellek yığınını bir dosyaya kaydedelim
heapdump.writeSnapshot('./heapdump-' + Date.now() + '.heapsnapshot');
Bellek Sızıntısını Çözme Yöntemleri
# 1. Event Listener’ları Kapatın
Event listener’ları, ilgili işlerin tamamlandığı durumlarda doğru şekilde temizlemek gerekir. Eğer bir event listener, işlevini tamamladıktan sonra gereksiz yere çalışıyorsa, bellekte gereksiz yer kaplayacaktır.
const myEmitter = new EventEmitter();
function onDataReceived(data) {
console.log(data);
}
// Event listener’ı dinleyiciyi manuel olarak kaldırmak:
myEmitter.removeListener('data', onDataReceived);
# 2. Global Değişkenlerden Kaçının
Global değişkenler, programınızın her yerinden erişilebileceği için bellek sızıntılarına neden olabilir. Yalnızca gerçekten gerekliyse global değişkenleri kullanmalısınız.
setInterval veya setTimeout gibi zamanlayıcılar, uygun şekilde temizlenmediği zaman bellek sızıntısına yol açar. Zamanlayıcıları doğru şekilde temizlediğinizden emin olun.
const intervalId = setInterval(() => {
console.log("Bu işlem sürekli yapılır!");
}, 1000);
// Zamanlayıcıyı temizlemek
clearInterval(intervalId);
# 4. Bellek Sızıntılarını İzleme
Uygulamanızın bellek kullanımını sürekli izlemek, performans sorunlarını erken tespit etmek için önemlidir. Heapdump veya diğer profilleme araçlarını kullanarak, bellek sızıntılarının neden kaynaklandığını anlayabilirsiniz.
Node.js kullanırken memory leak warning hatası aldığınızda, ilk yapmanız gereken bellek kullanımınızı gözden geçirmek ve kaynakları doğru bir şekilde yönetmek olmalıdır. Event listener’lar, global değişkenler, zamanlayıcılar gibi yaygın hataları ortadan kaldırarak, uygulamanızın performansını artırabilir ve kullanıcı deneyimini geliştirebilirsiniz.
Bu yazıda, bellek sızıntılarının ne olduğunu, nerelerde meydana geldiğini ve nasıl çözüleceğini detaylı bir şekilde inceledik. Unutmayın, bellek yönetimi yazılım geliştirme sürecinin en önemli parçalarından biridir. Performans sorunlarınız arttığında, bellek sızıntıları şüphelisi olarak en önce bu adımları kontrol edin.