Android Memory Leak Tespiti: LeakCanary ile Hata Ayıklama

Android uygulamalarında bellek sızıntısı (memory leak) çok yaygın bir sorundur. Bir nesne artık kullanılmıyor olsa bile referansı hala bellekte tutulduğunda sızıntı oluşur. Uzun çalışan uygulamalarda bu, ciddi performans düşüşüne ve çökmesine neden olabilir. LeakCanary, Square tarafından geliştirilen bir kütüphane olup, bu sızıntıları otomatik olarak tespit eder ve size raporlar.

Kurulum ve Temel Ayarlama

LeakCanary'yi projenize eklemek için build.gradle dosyasına bağımlılık ekleyin:

1dependencies {
2debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12'
3}

LeakCanary 2.0 ve sonrası otomatik olarak başlatılır; ContentProvider aracılığıyla uygulamanız açılır açılmaz çalışmaya başlar. Ek bir ayar yapmanıza gerek yoktur.

Sızıntı Örneği ve Tespiti

Aşağıdaki kod, tipik bir bellek sızıntısı oluşturur:

1public class MainActivity extends AppCompatActivity {
2private static LeakyHolder holder;
3
4@Override
5protected void onCreate(Bundle savedInstanceState) {
6super.onCreate(savedInstanceState);
7setContentView(R.layout.activity_main);
8
9// Bu Activity'ye referans tutan static nesne
10holder = new LeakyHolder(this);
11}
12
13private static class LeakyHolder {
14private Context context;
15
16LeakyHolder(Context context) {
17this.context = context;
18}
19}
20}

Bu kodda LeakyHolder static bir nesne olduğu için, Activity yok olsa bile referansı bellekte kalır. LeakCanary bunu algılar.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Raporu İnceleme

Uygulamayı çalıştırıp Activity'yi kapatıp tekrar açtığınızda, LeakCanary sızıntıyı tespit ederse bildirim gösterir. Bildirimi tıklarsanız detaylı bir rapor açılır. Bu rapor şunları gösterir:

  • Sızıntının tam konumu (hangi sınıf, hangi değişken)
  • Bellek zinciri (hangi referanslar sızıntıya neden oldu)
  • Çözüm önerisi

Düzeltme

Yukarıdaki örneği düzeltmek için static referansı kaldırın:

1public class MainActivity extends AppCompatActivity {
2private LeakyHolder holder;
3
4@Override
5protected void onCreate(Bundle savedInstanceState) {
6super.onCreate(savedInstanceState);
7setContentView(R.layout.activity_main);
8holder = new LeakyHolder(this);
9}
10}

Artık Activity yok olduğunda holder da silinir ve sızıntı ortadan kalkar.

Pratik İpucu

LeakCanary sadece debug derlemesinde çalışır; yayın sürümüne dahil edilmez. Geliştirme sırasında sık sık Activity geçişleri yaparak sızıntıları erkenden bulabilirsiniz. Logcat'te de LeakCanary mesajlarını görebilirsiniz.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz