Sobes.tech
Middle+

Как LeakCanary обнаруживает утечку памяти?

sobes.tech AI

Risposta dell'AI

LeakCanary funziona in più fasi:

  1. Rilevamento di perdite: Tiene traccia del ciclo di vita degli oggetti osservati, come Fragment, Activity, View. Quando un oggetto di questo tipo viene distrutto, LeakCanary lo inserisce in un riferimento debole (WeakReference) e avvia il garbage collector.
  2. Verifica del riferimento: Dopo il garbage collector, LeakCanary verifica se esiste ancora un riferimento all’oggetto. Se sì, significa che l’oggetto non è stato raccolto e probabilmente c’è una perdita.
  3. Dump della memoria (heap dump): In caso di rilevamento di una possibile perdita, LeakCanary effettua un dump della memoria dell’applicazione. È una istantanea di tutta la memoria occupata dagli oggetti dell’applicazione in un dato momento.
  4. Analisi del grafo degli oggetti: LeakCanary analizza il grafo degli oggetti nel dump di memoria per trovare un percorso dalle radici del garbage collector (GC roots) all’oggetto sospetto di perdita. Questo percorso mostra perché l’oggetto non è stato raccolto.
  5. Generazione del rapporto: Basandosi sull’analisi, LeakCanary genera un rapporto dettagliato sulla perdita, includendo il percorso di ritenzione dell’oggetto (l’oggetto che tiene riferisce all’oggetto trattenuto), il tipo di oggetto e il luogo nel codice dove probabilmente si è verificata la perdita. Il rapporto viene mostrato come notifica o all’interno dell’app.
// Esempio semplice di monitoraggio di un oggetto A dopo la sua distruzione
@Override
protected void onDestroy() {
    super.onDestroy();
    // Avvolge l’oggetto in un WeakReference e lo passa a LeakCanary
    refWatcher.watch(this);
}

LeakCanary utilizza i propri parser e algoritmi per analizzare i file hprof (formato di dump della memoria) per trovare efficacemente i percorsi di ritenzione degli oggetti.