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