Sobes.tech
Middle+

Come rileva LeakCanary i riferimenti alle Activity distrutte?

sobes.tech AI

Risposta dell'AI

LeakCanary utilizza un riferimento debole (Reference Fantasma) o un riferimento forte (Reference Forte) in un osservatore speciale che "ascolta" il ciclo di vita dell'Activity. Quando l'Activity viene distrutta, LeakCanary registra l'ora e aspetta la raccolta dei rifiuti. Se, dopo la raccolta, l'oggetto Activity esiste ancora in memoria, LeakCanary avvia un dump della heap, lo analizza e costruisce un grafo di raggiungibilità per trovare il percorso dalle GC Roots a questa Activity "fuggita".

Passaggi chiave:

  1. Monitoraggio del ciclo di vita: LeakCanary registra ActivityLifecycleCallbacks.
  2. Segnalibro (Bookmarking): Al chiamare onDestroy(), LeakCanary crea un riferimento all'Activity (a seconda della versione) e registra l'ora.
  3. Attesa del GC: LeakCanary aspetta che avvenga la raccolta dei rifiuti per verificare se l'oggetto è stato distrutto.
  4. Verifica post-GC: Se l'oggetto Activity è ancora accessibile dopo il GC, indica una potenziale fuga.
  5. Dump della heap: LeakCanary chiama Debug.dumpHprofData() per salvare lo stato attuale della memoria.
  6. Analisi del dump: LeakCanary (tramite Memory Analyzer Tool (MAT) o il suo analizzatore) scansiona il dump della memoria.
  7. Ricerca del percorso: Lo strumento trova percorsi nel grafo di oggetti dagli elementi radice GC fino all'oggetto "fuggente".
  8. Rapporto: LeakCanary genera un rapporto leggibile che mostra la catena di riferimenti che mantiene l'oggetto fuori dal GC.