Middle+
Как LeakCanary обнаруживает утечку памяти?
sobes.tech MI
Válasz az MI-től
A LeakCanary több lépésben működik:
- Szivárgás észlelése: Követi az észlelt objektumok, például Fragment, Activity, View életciklusát. Amikor egy ilyen objektum megsemmisül, a LeakCanary gyenge hivatkozásba (WeakReference) helyezi, és elindítja a szemétgyűjtőt.
- Hivatkozás ellenőrzése: A szemétgyűjtés után a LeakCanary ellenőrzi, hogy még létezik-e hivatkozás az objektumra. Ha igen, az azt jelenti, hogy az objektum nem lett összegyűjtve, és valószínűleg szivárgás történt.
- Heap dump: Egy lehetséges szivárgás észlelése esetén a LeakCanary készít egy heap dump-ot az alkalmazásról. Ez az összes memória pillanatképét mutatja, amit az alkalmazás objektumai foglalnak el egy adott időpontban.
- Objektum gráf elemzése: A LeakCanary elemzi a heap dump-ban lévő objektum gráfot, hogy megtalálja az utat a GC gyökereitől (GC roots) a gyanított szivárgó objektumig. Ez az útmutató megmutatja, miért nem gyűjtötte össze a szemét az objektumot.
- Jelentés generálása: Az elemzés alapján a LeakCanary részletes jelentést készít a szivárgásról, beleértve az objektum tartási útját (az a objektum, amely tartja az objektumot), az objektumtípust és a kód azon helyét, ahol valószínűleg megtörtént a szivárgás. A jelentés értesítésként vagy az alkalmazáson belül jelenik meg.
// Egyszerű példa egy objektum A követésére annak megsemmisítése után
@Override
protected void onDestroy() {
super.onDestroy();
// Az objektum becsomagolása WeakReference-be és átadása a LeakCanary-nek
refWatcher.watch(this);
}
A LeakCanary saját elemzőket és algoritmusokat használ, hogy hatékonyan találja meg az objektumok tartási útjait a hprof fájlok (heap dump formátum) elemzésével.