Sobes.tech
Middle+

Cum identifică LeakCanary referințele către Activity-urile distruse?

sobes.tech AI

Răspuns de la AI

LeakCanary utilizează o referință slabă (Referință Fantomă) sau o referință puternică (Referință Puternică) într-un observator special care "ascultă" ciclul de viață al Activity-ului. Când Activity-ul este distrus, LeakCanary înregistrează timpul și așteaptă colectarea gunoiului. Dacă, după colectarea gunoiului, obiectul Activity încă există în memorie, LeakCanary inițiază o captură a heap-ului, o analizează și construiește un grafic de accesibilitate pentru a găsi drumul de la GC Roots către acest Activity "scurs".

Pași cheie:

  1. Monitorizarea ciclului de viață: LeakCanary înregistrează ActivityLifecycleCallbacks.
  2. Marcaj (Bookmarking): La apelarea onDestroy(), LeakCanary creează o referință la Activity (în funcție de versiune) și înregistrează timpul.
  3. Așteptarea GC: LeakCanary așteaptă ca colectarea gunoiului să aibă loc pentru a verifica dacă obiectul a fost distrus.
  4. Verificare după GC: Dacă obiectul Activity este încă accesibil după GC, indică o posibilă scurgere.
  5. Dump-ul heap-ului: LeakCanary apelează Debug.dumpHprofData() pentru a salva starea curentă a memoriei.
  6. Analiza dump-ului: LeakCanary (prin Memory Analyzer Tool (MAT) sau propriul său analizator) scanează dump-ul de memorie.
  7. Căutarea drumului: Instrumentul găsește drumuri în graful de obiecte de la GC Roots până la obiectul "scurs".
  8. Raport: LeakCanary generează un raport lizibil, arătând lanțul de referințe care menține obiectul departe de garbage collector.