Kısa cevap
Bellek sızıntısı, bir uygulamanın belleği kullanıp işi bittikten sonra serbest bırakmaması durumunda oluşur. Sürekli artan bellek tüketimi ve yavaşlama ile kendini gösterir. Bellek izleme araçları ve kod analizi ile tespit edilir, en yaygın nedeni unutulan referanslar olmak üzere nedenin ortadan kaldırılmasıyla çözülür.
Sorun nasıl anlaşılır
- Uygulamanın bellek tüketimi çalışma sırasında sürekli artar
- Uygulama zamanla yavaşlar ve kararsız hale gelir
- Program bellek yetersizliği hatasıyla çöker
- İşletim sistemi takas (swap) kullanmaya başlar ve donar
En yaygın nedenler
Unutulan referanslar
Nesneler artık gerekli olmasa da bir referans onları işaret etmeye devam ettiği için bellekte kalır. Bu, sızıntıların en yaygın nedenidir.
Kaldırılmayan olay dinleyicileri
Kaldırılmadan eklenen dinleyiciler ve geri çağırma işlevleri nesneleri bellekte tutar. Özellikle uzun süre çalışan uygulamalarda sık görülür.
Sınırsız önbellekler
Sınırı veya giriş süresi dolmayan bir önbellek zamanla kullanılabilir tüm belleği kaplar. Aynısı genel koleksiyonlar için de geçerlidir.
Referans döngüleri
Birbirine referans veren nesneler, çöp toplayıcı (garbage collector) onları temizleyemediğinde bellekte kalabilir. Referans sayımı kullanan dillerde ve ortamlarda döngüler sık sık sızıntı nedeni olur.
Adım adım çözüm
- 1
Bunun bir sızıntı olduğunu doğrulayın
Uygulamayı başlatın ve bellek tüketimini Görev Yöneticisi (Windows) veya Etkinlik İzleyicisi (macOS) ile izleyin. Bellek zamanla artıyor ve işlemler bittikten sonra düşmüyorsa muhtemelen sızıntı vardır. Başlangıç değerini kaydedin ve aynı işlemi birkaç kez tekrarlayın.
- 2
Artışa neden olan senaryoyu izole edin
İşlevleri tek tek tekrarlayın (ekran açma, veri yükleme, istek gönderme) ve belleği gözlemleyin. Amaç, sürekli artışa neden olan en küçük adım dizisini bulmaktır. Daha sonra tekrarlayabilmek için adımları not edin.
- 3
Bellek izleme aracını kullanın
Tarayıcıda DevTools > Memory bölümünü açın ve şüpheli işlemden önce ve sonra heap anlık görüntüsü alın. Görüntüleri karşılaştırın ve bellekte kalan nesneleri arayın. Node.js'te
node --inspectve Chrome DevTools kullanın, .NET'te Visual Studio Diagnostic Tools kullanın. - 4
Heap anlık görüntüsünü analiz edin
Araçta nesne listesini boyuta veya örnek sayısına göre sıralayın. Kaldırılması gereken nesnelere dikkat edin. Nesneyi bellekte neyin tuttuğunu görmek için referans zincirlerini (retainers) izleyin.
- 5
Olay dinleyicilerini ve zamanlayıcıları kontrol edin
Kodda dinleyici eklediğiniz yerleri (
addEventListener,on,subscribe) arayın ve bunları kaldırıp kaldırmadığınızı (removeEventListener,off,unsubscribe) kontrol edin. AynısısetIntervalvesetTimeoutiçin de geçerlidir; artık gerekli olmadıklarındaclearIntervalveclearTimeoutile durdurulmalıdır. - 6
Önbellekleri ve koleksiyonları sınırlayın
Önbellekler için boyut sınırı veya son kullanma süresi kullanın (ör. LRU önbellek). Kontrolsüz büyüyen genel dizilerden ve haritalardan kaçının. Eski girişleri düzenli olarak temizleyin.
- 7
Nedeni ortadan kaldırın ve test edin
Nedeni bulduktan sonra kodu referansları serbest bırakacak şekilde değiştirin. Aynı testi tekrarlayın ve belleği izleyin: kararlı kalmalıdır. Gerekirse belleğin artmadığını kontrol eden otomatik bir test ekleyin.
Hiçbir şey yardımcı olmazsa
Nedeni bulamıyorsanız şüphelendiğiniz kod bölümünü basitleştirip yeniden test etmeyi düşünün. Bazen sızıntı üçüncü taraf bir kitaplıktan kaynaklanır; güncel olup olmadığını ve bilinen bir sorun olup olmadığını kontrol edin. Üretimde belleği izleme araçlarıyla izleyin ve tüketim sınırı aştığında alarm kurun. Karmaşık durumlar için heap profiler ve bellek ayırma analiz araçları gibi gelişmiş araçları kullanın. Sızıntı yalnızca yük altında ortaya çıkıyorsa birden fazla kullanıcı simülasyonu ile test edin.
Tekrarlanmaması için
- Dinleyicilerin ve zamanlayıcıların eklendiği yerler için kodu düzenli olarak gözden geçirin
- Sınırlı önbellekler kullanın ve koleksiyonları temizleyin
- Üretime almadan önce belleği test edin
- Üretimde bellek tüketimini izleyin
Ne zaman uzmana başvurmalı
Sızıntı üretimde çökmelere neden oluyorsa veya yeniden oluşturamıyorsanız, analiz için IT desteğine veya daha deneyimli bir geliştiriciye başvurun.
Yazılım ve ürün geliştirme · Özel uygulamalar, SaaS ve 4-8 haftada MVPSık sorulan sorular
Uygulamanın bellek sızıntısı mı yoksa sadece yoğun mu olduğunu nasıl anlarım?
Bellek çalışma sırasında sürekli artıyor ve işlemler bittikten sonra serbest bırakılmıyorsa muhtemelen sızıntı vardır. Yoğun bir uygulama daha fazla bellek kullanabilir ancak artık ihtiyaç duymadığında serbest bırakmalıdır.
Bellek sızıntısı güvenlik açısından tehlikeli midir?
Olabilir. Sızıntı kaynak tükenmesine ve sistem çökmesine yol açabilir, saldırganlar bunu hizmet dışı bırakma (DoS) için kullanabilir. Ayrıca hassas veri içeren bellek daha uzun süre erişilebilir kalabilir, bu da bilgi sızıntısı riskini artırır.
Bellek ne sıklıkla kontrol edilmelidir?
Her büyük değişiklikte ve üretimde düzenli olarak kontrol edilmesi önerilir. Otomatik testler sızıntının erken tespit edilmesine yardımcı olabilir.