Memory Leak Nedir? - Android

Tuğçe Aras
5 min readApr 3, 2023

--

Selamlar 👋, konumuz Memory Leak. Ne olduğu, memory leak sebepleri, memory leak’i önlemek için hangi araçların kullanıldığı,.. gibi başlıklara değineceğim. Başlayalım o halde ✨

“A small leak will sink a great ship” — Benjamin Franklin

💧 Memory Leak Nedir?

  • Kullanılmayan nesnelerin bellekten temizlenememesi durumudur. Yani kullanılmayan bir nesnenin, kullanımda olan başka bir nesne tarafından referans alınması durumudur. Dolayısıyla da Garbage Collector kullanılmayan o nesneye artık dokunamaz. Yani bellekten temizleme işlemini yapamaz. Buna bağlı olarak da Garbage Collector kullanılmayan nesneleri temizleyemediğinde bu nesneleri tutan bellek birimi de dolu olacaktır. Yer sıkıntısı olacağından sistem yeni nesneler için yer ayırmak istediğinde Garbage Collector’ı sık çağırma isteği duyacaktır. Bu da uygulamanın yavaşlamasına ya da crash olmasına neden olabilmektedir.
url: proandroiddev

❓ Peki, Memory Leak ne gibi problemlere neden olmaktadır?

  1. Memory Leak meydana geldiğinde daha az kullanılabilir bellek alanı oluşur ve Garbage Collector’ı çağırma ihtiyacı duyar.

Android’in 16 ms’lik bir frame işleme eşiği vardır. Eğer Garbage Collector’ın işi bu süreden daha uzun sürerse Android, frame’leri kaybetmeye, uygulama da yavaşlamaya başlar.

2. Memory Leak olduğunda kullanılmayan nesnelerden bellek talep edilemez. Sistem ise uygulama için daha fazla bellek ayırmayı reddedecektir. Bu durum crash’lere neden olabilmektedir. Kullanıcı deneyimi anlamında da istenilen bir durum değildir.

3. Memory Leak sorunları Q/A testte bulmak zordur.

Peki, o kadar bahsettik bu Garbage Collector nedir? Ne işe yarar? 🤔 👇

url: proandroiddev

🔹 Garbage Collector Nedir?

  • Kullanılmayan nesnelerin bellekten otomatik olarak silinmesi işlemidir.

Çalışma mantığı da aslında şu şekildedir:

  • Ağaç yapısı olarak düşünelim. Andorid uygulaması başladığında, başlangıç nesnesi ağacın kökü olarak kabul edilerek bir bellek ağacı oluşturulur.
  • Kök doğrudan ya da dolaylı olarak referansına sahip olabilecek başka nesneler oluşturur ve bu nesnelerden de başka nesneler başlatılır. Bir referans zinciri oluşturulur ve bellek ağacı meydana gelmiş olur.
  • Garbage Collector kökten başlar ve doğrudan ya da dolaylı olarak köke bağlı nesne referanslarını kullanımda olarak işaretler. İşaretlenmemiş nesne referansları kullanılmamış olarak kabul edilir ve Garbage Collector tarafından temizleme işlemi gerçekleştirilir.
url: garbage collector

🔹 Memory Leak Sebepleri Nelerdir?

  • Listeners’ları işimiz bittiğinde unregister yapmamak
  • Local Broadcast receiver’ları işimiz bittiğinde unregister yapmamak
  • Inner class kullanımı

Not: Inner class’lar her ne kadar static bir yapıda olmasalar da üst class’ın referansını tutabilmekte ve bu durum da memory leak’e neden olabilmektedir.

  • Singleton kullanımı
  • Static context kullanımı
  • Static variable kullanımı
  • View referansları

… gibi nedenler bulunmaktadır.

NOT: Birkaç yerde static keyword’ü geçti. Nedir peki tam olarak bu keyword ve konumuzla ne gibi bir bağlantısı var? 🤔

Static keyword’nün kullanılması demek, kullanılsa da kullanılmasa da memory’den ölmeyen nesnelerin oluşması demek. Uygulama ayakta olduğu sürece memory’den silinmiyorlar.

Aslında Garbage Collector’a da şunu demiş oluyoruz:

Ben static yapılıyım bana dokunma. İşine devam et.

🔹 Memory Leak’i Neden Önemsemeliyiz?

  • Uygulamada gecikmelere neden olabilmektedir.
url: lag app
  • ANR’ye (Application Not Responding) yol açar.
url: ANR
  • OutOfMemory hatasına neden olur. (Uygulamanın çökmesi)
url: OutOfMemory

🔹 Memory Leak İçin Kullanılan Araçlar

url: memory leak araçları

1) Android Profiler

  • Andorid Profiler, uygulamamızın sadece bellek değil aynı zamanda CPU, ağ ve pil kaynaklarını nasıl kullandığını anlamamızı sağlayacak gerçek zamanlı veriler kullanır.
  • Andorid Profiler, Andorid 5.0 (API level 21) ve üstü ile uyumludur.
url: developer.andorid

Resimdeki alanları açıklamak gerekirse:

  • 1 numaralı kısım -> İşlemin hangi cihaz üzerinde gerçekleştiğini gösterir.
  • 2 numaralı kısım -> Session oluşturma/silme işlemlerinin yer aldığı ve aynı zamanda hangi session üzerinde işlem yaptığımızı gösterir.
  • 3 numaralı kısım -> Timeline’nın ne kadarının görüntülenmesini istiyorsak ona göre yakınlaştırma/uzaklaştırma işlemlerinin yapıldığı kısımdır.
  • 4 numaralı kısım -> Kullanıcı girişi ile ilgili işlemleri gösterir. (Ekranı çevirme, ses ayarı, ..)
  • 5 numaralı kısım -> Bellek, enerji kullanımı, ağ ve CPU kullanımı için grafikleri içeren bir timeline’dır.

1) Leak Canary

  • Uygulamadaki memory leak’leri tespit etmede kullanılan bir diğer aracımız.
url: leak canary
  • Leak Canary’i kullanabilmek için aşağıdaki dependency’i projemize entegre etmeliyiz.
dependencies {
// debugImplementation because LeakCanary should only run in debug builds.
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.10'
}
  • Leak Canary Memory Leak’i 4 adımda algılar. Bu adımlar:
  1. Tutulan nesneleri algılama (Detected retained object)
  2. Yığını boşaltmak (Dumping the heap)
  3. Yığını analiz etme (Analyzing the heap)
  4. Sızıntıların sınıflandırılması (Categorizing leaks)

Yukarıdaki maddelerin ayrıntılarına aşağıdaki linkten erişebilirsiniz 👇

Kaynaklar

--

--