Middle+
Dump-u analiz edərkən yaddaş sızmasının olub-olmadığını necə müəyyən etmək olar?
sobes.tech Süni İntellekt
AI-dan cavab
Yaddaş sızıntısını aşkar etmək üçün, heap-dəki obyektlər qrafikini analiz edən alətlərdən istifadə olunur. Əsas addımlar:
-
Yaddaş dump-i əldə edin:
- Android Studio Memory Profiler vasitəsilə.
adb shell dumpheap <paket_adi> /data/local/tmp/dump.hprofəmri ilə.- Sistem çağırışı
Debug.dumpHprofData(filePath)ilə.
-
Dump-i analiz edin:
- Android Studio-da dump-i açın: Memory Profiler-də və ya "File" -> "Open" menyusu vasitəsilə.
- Obyektləri analiz edin: obyektləri ölçüsünə (Shallow Size, Retained Size) və nümunə sayına görə sıralayın.
- Şübhəli obyektləri tapın: silinməli olan sinifləri (məsələn, Activity, Fragment, Contexts) axtarın, lakin çox sayda nümunə və ya böyük
Retained Size-a malikdirlər. - Obyektə olan yolu öyrənin (Reference Chain): şübhəli obyekt seçin və onun kök obyektlərə (GC roots) olan yolunu izləyin. Bu, kimlərin referans tutduğunu göstərəcək və toplanmanı əngəlləyəcək.
- Statik referansları axtarın: statik sahələr uzunömürlü referanslar saxlayırsa, sızıntı mənbəyi ola bilər.
- LeakCanary istifadə edin: kitabxana, sızıntıların aşkarlanmasını, dump və analizini avtomatlaşdırır və sızıntı yolunun ətraflı təsvirini verir.
-
Nəticələri şərh edin:
- Uzun yol, silinməli obyektlərə referanslar ehtiva edirsə, problem göstəricisidir.
- Statik sahələr, AsyncTask, gecikmiş Handlerlər, düzgün qeydiyyatdan çıxmayan listenerlər/callbacklar və ya singletonlar, çox vaxt sızıntıların səbəbidir.
Android Studio Memory Profiler-də GC root yolunun nümunəsi:
// Sızıntıya işarə edən GC root yol nümunəsi
// android.app.Activity nümunəsi mDestroyed=true ilə
// android.widget.LinearLayout referansı
// android.view.View $ListenerInfo referansı
// com.example.MyActivity$1 (View.OnClickListener-ı həyata keçirən anonim sinif)
// com.example.MyActivity referansı (sızıntı)
Bu nümunədə, anonim sinif (düyməyə klik dinləyicisi) MyActivity-yə dolayı referans saxlayır, halbuki fəaliyyət artıq məhv edilməlidir (mDestroyed=true). Bu dinləyici, başqa uzunömürlü obyekt (məsələn, statik sahə və ya singleton) tərəfindən qeydiyyata alınmış və ya saxlanılır kimi görünür.