Memory Leak
Bellek Sızıntısı
- Okunuşu
- memıri lik
Kısaca
Memory leak, bir programın artık ihtiyaç duymadığı belleği tutmayı sürdürdüğü hatadır; bellek kullanımı zamanla artar, sistem yavaşlayabilir ya da çökebilir.
Memory leak (bellek sızıntısı) nedir?
Memory leak, bir program bellek ayırıp sonra onu gözden kaybettiğinde ya da ona gereksiz bir başvuru tutmaya devam ettiğinde ortaya çıkar; bellek hiçbir zaman serbest bırakılmaz. Küçük bir sızıntı önemli olmayabilir, ancak bir sunucu, mobil uygulama ya da tarayıcı sekmesi gibi uzun süre çalışan bir programda sızan bellek, program yavaşlayana, işletim sistemi tarafından sonlandırılana veya bellek yetersizliği hatasıyla çökene kadar birikir.
C ve C++ gibi elle bellek yönetimi olan dillerde sızıntı genellikle belleğin malloc ya da new ile ayrılıp hiç free veya delete ile serbest bırakılmaması demektir. JavaScript, Java ve Python gibi çöp toplamalı (garbage-collected) dillerde çöp toplayıcı yalnızca artık hiçbir şeyin başvurmadığı nesneleri serbest bırakır; bu yüzden sızıntılar kazara takılı kalan başvurulardan gelir. Tipik nedenler, sürekli büyüyen önbellekler ya da global diziler, hiç kaldırılmayan olay dinleyicileri ve zamanlayıcılar ve büyük nesneleri yakalayan closure'lardır.
Memory leak, müşterilerin ayrılıp masalarının hiç toplanmadığı bir restorana benzer. Terk edilmiş her masa zararsız görünür, ancak yoğun bir akşamın sonunda yeni misafirlere yer kalmaz. Geliştiriciler sızıntıları, bellek kullanımını zaman içinde izleyerek ve tarayıcı geliştirici araçlarındaki heap anlık görüntülerini, bellek profilleyicilerini veya Valgrind ile AddressSanitizer gibi sızıntı dedektörlerini kullanarak bulur.
Memory leak, yüksek bellek kullanımıyla aynı şey değildir. Çok bellek kullanan ama kararlı bir düzeyde kalan bir program sızdırmıyordur; sızdıran bir programın belleği ise çalıştıkça üst sınır olmadan tırmanmaya devam eder. Bir process sonlandığında işletim sistemi kullandığı tüm belleği geri alır; sızıntıların esas olarak uzun süre çalışan programlara zarar vermesinin nedeni budur.
Önemli noktalar
- Memory leak, program artık ihtiyaç duymasa da ayrılmış halde kalan bellektir.
- Sızıntılar bellek kullanımının zamanla istikrarlı biçimde artmasına yol açar.
- Çöp toplama, takılı kalan başvuruların yol açtığı sızıntıları önlemez.
- Yaygın nedenler arasında sınırsız önbellekler, unutulan olay dinleyicileri ve hiç temizlenmeyen zamanlayıcılar vardır.
- Heap anlık görüntüleri ve bellek profilleyicileri, sızan nesneleri bulmaya yardımcı olur.
Örnek
// Leak: this cache grows forever because entries are never removed
const cache = new Map();
function getUser(id) {
if (!cache.has(id)) cache.set(id, loadUser(id));
return cache.get(id);
}
// Leak: each call adds a new listener that keeps panel alive
function openPanel(panel) {
window.addEventListener("resize", () => panel.resize());
}
// Fix: cap the cache size and remove listeners when the panel closesSık sorulan sorular
Çöp toplamalı bir dilde memory leak olabilir mi?
Evet. Çöp toplayıcı yalnızca artık erişilemeyen nesneleri serbest bırakır; bu yüzden kodunuz global bir önbellekte ya da bir olay dinleyicisinde olduğu gibi gereksiz bir başvuruyu tutuyorsa o bellek asla geri alınmaz.
Bir memory leak'i nasıl bulurum?
Önce büyümeye devam ettiğini doğrulamak için programın bellek kullanımını zaman içinde izleyin. Ardından heap anlık görüntüleri alın veya bir bellek profilleyicisi kullanarak anlık görüntüler arasında hangi nesnelerin biriktiğini karşılaştırın; bu nesneler genellikle sızıntıyı işaret eder.
Memory leak program kapatıldıktan sonra da sürer mi?
Hayır. Bir process sonlandığında işletim sistemi kullandığı tüm belleği geri alır. Sızıntılar en çok sunucular ve günlerce açık kalan uygulamalar gibi uzun süre çalışan programlarda önemlidir.
İlgili sayfalar
- Çöp toplamaProgramlamanın Temelleri, s. 9Çöp toplama, dil çalışma zamanının programın artık kullanamadığı verileri bulup bu belleği yeniden kullanıma açtığı otomatik bellek yönetimidir.
- Sanal Bellekİşletim Sistemleri, s. 26Sanal bellek, her process'e kendine ait özel bir adres alanı veren ve bunu arka planda fiziksel RAM'e ya da diske eşleyen bir işletim sistemi tekniğidir.
- Processİşletim Sistemleri, s. 23Process, bir programın çalışan örneğidir; işletim sistemi tarafından yönetilen kendi bellek alanına, kaynaklarına ve en az bir yürütme iş parçacığına sahiptir.
- ClosureProgramlamanın Temelleri, s. 6Closure, oluşturulduğu kapsamdaki değişkenleri hatırlayan bir fonksiyondur; dıştaki fonksiyon sona erdikten sonra bile bu değişkenleri kullanabilir.
- GözlemlenebilirlikDevOps ve Bulut, s. 22Gözlemlenebilirlik, çalışan bir yazılım sisteminin içinde olup biteni log, metrik ve trace verilerini toplayıp analiz ederek anlayabilme yeteneğidir.
- Heap Belleğiİşletim Sistemleri, s. 13Heap belleği, boyutu ya da ömrü önceden bilinmeyen, çalışma zamanında ayrılan ve onu oluşturan fonksiyondan uzun yaşayabilen verilerin tutulduğu bölgedir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin