Middle+
Dump analizi sırasında bellek sızıntısının varlığını nasıl belirleriz?
sobes.tech yapay zeka
AI'dan gelen yanıt
Heap dump'ında (HPROF dosyası) bellek sızıntısını tespit etmek için, heap'teki nesne grafiğini analiz eden araçlar kullanılır. Ana adımlar:
-
Bellek dökümü alın:
- Android Studio Memory Profiler aracılığıyla.
adb shell dumpheap <paket_adi> /data/local/tmp/dump.hprofkomutuyla.- Sistem çağrısı
Debug.dumpHprofData(filePath)kullanılarak.
-
Dökümü analiz et:
- Dökümü Android Studio'da aç: Memory Profiler veya "File" -> "Open" menüsü aracılığıyla.
- Nesneleri analiz et: Nesneleri boyutlarına (Shallow Size, Retained Size) ve örnek sayısına göre sırala.
- Şüpheli nesneleri ara: Kapatılması gereken sınıflar (örneğin, Activity, Fragment, Contexts) çok sayıda örneğe veya büyük
Retained Size'a sahipse. - Nesneye giden yolu incele (Reference Chain): Şüpheli nesneyi seç ve onu kök nesnelere (GC roots) giden yolunu izle. Bu, referansı tutan kişinin kim olduğunu gösterir ve çöp toplamayı engeller.
- Statik referansları ara: Statik alanlar, uzun ömürlü referanslar tutuyorsa, genellikle sızıntı kaynağıdır.
- LeakCanary kullan: Kütüphane, sızıntıların tespiti, dökümü ve analizi işlemlerini otomatikleştirir ve sızıntı yolunun ayrıntılı açıklamasını sağlar.
-
Sonuçları yorumla:
- Uzun bir yol, silinmesi gereken nesnelere referanslar içeriyorsa, sorunu gösterir.
- Statik alanlar, AsyncTask, gecikmeli Handler'lar, düzgün şekilde kaydedilmemiş listener'lar/callback'ler veya singleton'lar, genellikle sızıntı nedenidir.
Android Studio Memory Profiler'da GC root yolunun analizi örneği:
// Sızıntıyı gösteren GC root yol örneği
// android.app.Activity örneği mDestroyed=true
// android.widget.LinearLayout referansı
// android.view.View $ListenerInfo referansı
// com.example.MyActivity$1 anonim sınıfı (View.OnClickListener uygulayan)
// com.example.MyActivity referansı (sızıntı)
Bu örnekte, bir anonim sınıf (buton tıklama dinleyicisi), MyActivity'ye zımni bir referans tutar, oysa aktivite zaten yok edilmelidir (mDestroyed=true). Bu dinleyici, başka bir uzun ömürlü nesne (örneğin, statik alan veya singleton) tarafından kaydedilmiş veya tutuluyor gibi görünüyor.