Bellek Sızıntısı Nedir?
JavaScript'in garbage collection (çöp toplama) mekanizması, genellikle belleği yönetir, ancak bazı durumlarda, çöp toplama doğru şekilde çalışamaz. Bu da bellek sızıntısına yol açar. Şimdi, JavaScript'te bellek sızıntılarının en yaygın oluştuğu durumlara göz atalım.
1. Global Değişkenler
Örnek:
```javascript
var myGlobalVar = 'Hello World!'; // Global değişken
```
Eğer bu değişkeni kullanıp sonra silmezseniz, JavaScript çöp toplama mekanizması onu temizleyemez. Bu da bellekte gereksiz bir yük oluşturur. Global değişkenleri mümkün olduğunca az kullanmak en iyisidir.
2. Event Listener'lar
Örnek:
```javascript
function handleClick() {
console.log('Clicked!');
}
document.getElementById('myButton').addEventListener('click', handleClick);
```
Bu örnekte, `handleClick` fonksiyonu, `myButton` öğesinin tıklama olayına bağlanmış durumda. Eğer bu event listener'ı kaldırmazsanız, `myButton` öğesi ve fonksiyon birbirine bağlı kalır ve bellekte gereksiz bir referans oluşur. Bu da bellek sızıntısına neden olabilir.
3. DOM Elemanlarına Referanslar
Örnek:
```javascript
let myElement = document.getElementById('myElement');
// DOM öğesini silmediğiniz sürece, 'myElement' bellekte kalır
```
Eğer DOM öğesini kullandıktan sonra doğru şekilde serbest bırakmazsanız, bu da bellek sızıntısına yol açar.
4. Asenkron İşlemler
Örnek:
```javascript
setInterval(function() {
console.log('Doing something every 1 second');
}, 1000);
```
Eğer bu işlemi sonlandırmazsanız, her saniye fonksiyon çağrılmaya devam eder ve bu da bellekte gereksiz birikim yaratır. Bu tür durumlarda, asenkron işlemleri temizlemek çok önemlidir.
5. Kapanmamış Web Worker'lar
Örnek:
```javascript
let worker = new Worker('worker.js');
// Worker'ı kapatmadığınız sürece bellek sızıntısı meydana gelebilir
```
Worker'lar, sadece işi bitince sonlandırılmalıdır. Aksi takdirde, bellekte gereksiz bir yük oluşur.
Bellek Sızıntısını Tespit Etme
1. Chrome DevTools Açın: F12 tuşuna basarak veya sağ tıklayıp “İncele” diyerek Chrome DevTools'u açın.
2. Memory Panel'ini Kullanarak Bellek İzleme: DevTools'un "Memory" sekmesine giderek, "Heap Snapshot" veya "Allocation Timeline" gibi araçlarla belleği izleyebilirsiniz.
3. Performans İzleme: Chrome'un "Performance" sekmesi ile JavaScript'in çalışma süresi ve bellek kullanımı hakkında detaylı bilgi alabilirsiniz.
Bellek Sızıntılarını Önlemek İçin En İyi Pratikler
- Event Listener'ları Temizleyin: Event listener'ları dinledikten sonra, gereksiz hale geldiklerinde temizlemeyi unutmayın. `removeEventListener` ile listener'ları kaldırabilirsiniz.
```javascript
document.getElementById('myButton').removeEventListener('click', handleClick);
```
- DOM Elemanlarına Referansları Serbest Bırakın: DOM elemanlarına olan referansları kullanmadığınızda silmeyi alışkanlık haline getirin.
- Asenkron İşlemleri İyi Yönetin: Asenkron işlemleri kullanırken, onları temizlemeyi unutmayın.
```javascript
clearInterval(intervalId);
```
- Web Worker'ları Kapatın: Worker'lar işlerini bitirdikten sonra kapatılmalıdır.
```javascript
worker.terminate();
```