Middle+
Как LeakCanary обнаруживает утечку памяти?
sobes.tech KI
Antwort von AI
LeakCanary funktioniert in mehreren Schritten:
- Leckageerkennung: Es verfolgt den Lebenszyklus beobachteter Objekte wie Fragment, Activity, View. Wenn ein solches Objekt zerstört wird, legt LeakCanary es in eine schwache Referenz (WeakReference) und startet den Garbage Collector.
- Überprüfung der Referenz: Nach dem Garbage Collector überprüft LeakCanary, ob noch eine Referenz auf das Objekt besteht. Wenn ja, bedeutet dies, dass das Objekt nicht gesammelt wurde und wahrscheinlich eine Leckage vorliegt.
- Heap-Dump: Bei Erkennung eines möglichen Lecks erstellt LeakCanary einen Heap-Dump der Anwendung. Es ist eine Momentaufnahme des gesamten Speichers, der von den Objekten der Anwendung zu einem bestimmten Zeitpunkt belegt wird.
- Analyse des Objektdiagramms: LeakCanary analysiert das Objektdiagramm im Heap-Dump, um einen Pfad von den GC-Wurzeln bis zum vermuteten Leck-Objekt zu finden. Dieser Pfad zeigt, warum das Objekt nicht gesammelt wurde.
- Berichtserstellung: Basierend auf der Analyse generiert LeakCanary einen Bericht mit Details zum Leck, einschließlich des Haltepunkts des Objekts (das haltende Objekt verweist auf das gehaltene Objekt), des Objekttyps und des Ortes im Code, an dem das Leck wahrscheinlich aufgetreten ist. Der Bericht wird als Benachrichtigung oder innerhalb der Anwendung angezeigt.
// Einfaches Beispiel zur Verfolgung eines Objekts A nach seiner Zerstörung
@Override
protected void onDestroy() {
super.onDestroy();
// Verpackt das Objekt in eine WeakReference und übergibt es an LeakCanary
refWatcher.watch(this);
}
LeakCanary verwendet eigene Parser und Algorithmen zur Analyse von Hprof-Dateien (Heap-Dump-Format), um die Haltepunkte der Objekteffizient zu finden.