Android’de bellek sızıntılarını tespit etme ve yönetme

Merhabalar.

Bu yazımda Android’de bazen başımıza büyük işler çıkaran bellek sızıntıları ve onlarla nasıl başa çıkılabileceğinden bahsedeceğim.

Bellek sızıntısı nedir?

Uygulama çalışmaya devam ederken Application Not Responding(ANR) hatası alıp uygulama kapanıyorsa ya da bazı durumlarda gecikmeler yaşanıyorsa bunun sebebi bellek sızıntısıdır. Ayrıca uygulamayı kodlarken loglarda OutOfMemoryError hatası görmüş olabilirsiniz. İşte bunun sebebi de bellek sızıntısıdır.

Bildiğiniz üzere Garbage Collector gerekli olmayan nesnelerin referansını siler. Eğer uygulamanızda kullanmadığınız nesneleri tutuyorsanız gereksiz yere referans tutarsınız ve bellek şişmeye başlar dolayısıyla bellek sızıntısı olur.  En basitinden bile bir uygulama yapıyorsanız bellek sızıntısı problemi ile karşı karşıya kalabilirisiniz. Ama onu alt etmek tahmin edildiği kadar zor değildir.

Bellek sızıntıları, başa çıkılabilecek en kolay şey olduğu gibi, çeşitli yollardan kaynaklanabilir.
Peki nedir bu sebepler?
En önemli nedeni tabiki de kendi hatalarımızdır. Uygulama oluştururken bazı yaygın hatalardan kaçınmalıyız.
Uygulama belleğini şişirmemek için ne yapmalıyız?
  •  Arka planda ui, belirli nesnenin referansını tutar. Bellek sızıntısına yol açtığı için, arka plan görevindeki ui nesnesinin referansını asla tutmayın.
  • Static viewler kullanmaktan kaçının. Çünkü static viewlerin referansı silinmez.
  • Asla static Contextkullanmayın.

  • Context kullanırken dikkatli olun, hangi contextin uygun yerlerde olduğuna karar vermek en önemlisidir. Mümkünse application context kullanın.
  • Bir listener başlatmışsanız onu mutlaka onStop, onPause ya da onDestroy metodları içinde null ya da unregister yapın.

  • Inner classlar kullanın. Eğer inner class kullanacaksanız bunu static yapın çünkü static sınıf içerisinde bulunduğu sınıfa referans vermez. Inner class içerisinde de viewler kullanacaksanız bunları constructor aktarın ve weak reference (zayıf referans) olmasını sağlayın.

  • Anonim sınıfların kullanımına dikkat edin. Çünkü anonim sınıf kullanmak static olmayan inner class kullanmaya benzer.
  • WeakHashMap gibi collection yapılarında kesinlike view tutmayın. Çünkü bu yapı viewleri hard reference olarak tutar.

İşte tüm bunlar bellek sızıntısına sebep olan ve kullanıcıların uygulamayı kaldırmasına sebebiyet veren nedenler.

Peki tüm bunlar kontrolümüz dışından gerçekleşiyorsa, yukarıda saydığım nedenlerin dışında bir nedenden dolayı sızıntı gerçekleşiyorsa ve bu sızıntıları tespit etmekte zorlanıyorsak ne yapacağız?

Tam da bu vakit karşımıza hayat kurtacı bir kütüphane olan LeakCanary çıkıyor. Bu kütüphane size bellek sızıntısının nerede olduğunu ve hangi nedenden kaynaklandığını haber veriyor. Tek yapmanız gereken kendi dökümanında yer alan birkaç satır kodu projenize eklemek. Sonrasında LeakCanary uygulamanızın yanına bir uygulama gibi kuruluyor. Yani siz debug yaptığınızda 2 uygulama telefona/emulatore kuruluyor ve LeakCanary uygulamasını açtığınızda -varsa- bellek sızıntıları size gösteriliyor.

Umarım faydalı olmuştur.

Hepinize bol kodlu günler.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.