Memory Leak Nedir?
Memory Leak Warning Hatası Nereden Geliyor?
```
<--- Last few GCs --->
[1:0x55f82d1fd4e0] 95172 ms: Mark-sweep 1312.7 (1375.8) -> 1312.7 (1375.8) MB, 36.9 / 0.0 ms (average mu = 0.047, current mu = 0.001) allocation failure
```
Bu, uygulamanızın bellek kullanımının kontrolden çıktığını gösterir ve bir memory leak olduğunu işaret eder.
Memory Leak Sorununun Nedenleri
- Global Değişkenler: Global değişkenler, gereksiz yere bellekte kalır ve bu da zamanla bellek sızıntılarına yol açar.
- Kapanmayan Callback Fonksiyonları: Eğer callback fonksiyonları düzgün bir şekilde temizlenmezse, bellek sızıntısı oluşabilir.
- Event Listeners: Event listeners, eğer uygun şekilde temizlenmezse, bellekte kalabilir ve memory leak'e sebep olabilir.
- Büyük Veri Yapıları: Uygulamanın içindeki büyük veri yapıları da bellekte gereksiz yere tutuluyor olabilir.
Memory Leak Hatasını Tespit Etmek
# 1. Node.js Profiling
Node.js, `--inspect` bayrağı ile profilleme yapmanıza olanak tanır. Bu bayrak sayesinde, Chrome Developer Tools’u kullanarak bellek kullanımını izleyebilirsiniz.
```bash
node --inspect app.js
```
Bu komut, Chrome Developer Tools ile uygulamanızın bellek kullanımını izleyebilmenizi sağlar.
# 2. Heapdump Kullanmak
Heapdump, Node.js uygulamanızın hafıza kullanımını daha detaylı bir şekilde incelemenizi sağlar. Uygulamanızda bir bellek sızıntısı olduğunda, heapdump ile anlık hafıza dump’ı alabilirsiniz.
npm install heapdump
```
Kodun içinde şu şekilde kullanabilirsiniz:
```javascript
const heapdump = require('heapdump');
heapdump.writeSnapshot('/path/to/snapshot.heapsnapshot');
```
Bu snapshot dosyasını Chrome Developer Tools ile inceleyebilirsiniz.
Memory Leak Nasıl Önlenir?
# 1. Global Değişkenlerden Kaçının
Global değişkenler, Node.js uygulamalarında ciddi bellek sızıntılarına neden olabilir. Kodunuzu modüler hale getirin ve sadece gerektiği kadar global değişken kullanın.
Event listener'ları oluşturduktan sonra, bu listener'ları temizlemek çok önemlidir. Aksi takdirde, her event listener bellekte kalır ve bellek sızıntısı oluşur.
Örneğin:
```javascript
const eventEmitter = new EventEmitter();
function handleEvent() {
console.log("Event handled!");
}
eventEmitter.on('event', handleEvent);
// Event listener'ı temizleyin
eventEmitter.removeListener('event', handleEvent);
```
# 3. Callback Fonksiyonlarını Temizleyin
Callback fonksiyonları, özellikle uzun süre bellekte kalan büyük veri yapıları oluşturabiliyor. Bu yüzden callback'lerinizi doğru bir şekilde yönetmeniz gerekmektedir. Unutmayın, callback’ler bir işlem tamamlandığında temizlenmelidir.
Büyük veri yapılarını bellekten boşaltmayı unutmayın. Gereksiz veriler hafızada kalırsa, uygulamanızın performansını olumsuz etkileyebilir.
Sonuç
Unutmayın, kodunuzu sık sık test edin ve bellek kullanımını izleyin. Bu şekilde, bellek sızıntılarını erken aşamalarda tespit edip çözebilirsiniz!