Sobes.tech
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:

  1. 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ə.
  2. 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.
  3. 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.