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;34@Override5protected void onCreate(Bundle savedInstanceState) {6super.onCreate(savedInstanceState);7setContentView(R.layout.activity_main);89// Bu Activity'ye referans tutan static nesne10holder = new LeakyHolder(this);11}1213private static class LeakyHolder {14private Context context;1516LeakyHolder(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.
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;34@Override5protected 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.
0 yorum