Middle+
Как LeakCanary обнаруживает утечку памяти?
sobes.tech AI
Răspuns de la AI
LeakCanary funcționează în mai multe etape:
- Detectarea scurgerilor: Urmărește ciclul de viață al obiectelor observate, cum ar fi Fragment, Activity, View. Când un astfel de obiect este distrus, LeakCanary îl plasează într-o referință slabă (WeakReference) și pornește colectorul de gunoi.
- Verificarea referinței: După colectarea gunoiului, LeakCanary verifică dacă încă există o referință la obiect. Dacă da, înseamnă că obiectul nu a fost colectat și probabil există o scurgere.
- Dump-ul heap-ului: În cazul detectării unei posibile scurgeri, LeakCanary face un dump al heap-ului aplicației. Este o fotografie a întregii memorii ocupate de obiecte în acel moment.
- Analiza grafului de obiecte: LeakCanary analizează graful de obiecte din dump-ul heap-ului pentru a găsi un drum de la rădăcinile GC (GC roots) până la obiectul suspectat de scurgere. Acest drum arată de ce nu a fost colectat obiectul.
- Generarea raportului: Pe baza analizei, LeakCanary generează un raport cu detalii despre scurgere, inclusiv drumul de retenție al obiectului (obiectul care păstrează referința la obiectul reținut), tipul obiectului și locația în cod unde probabil s-a produs scurgerea. Raportul este afișat ca o notificare sau în interiorul aplicației.
// Exemplu simplu de urmărire a unui obiect A după distrugerea sa
@Override
protected void onDestroy() {
super.onDestroy();
// Împachetează obiectul într-o WeakReference și îl transmite către LeakCanary
refWatcher.watch(this);
}
LeakCanary folosește propriile sale parsere și algoritmi pentru a analiza fișierele hprof (formatul de dump al heap-ului) pentru a găsi eficient căile de retenție ale obiectelor.