Sobes.tech
Middle+

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

sobes.tech AI

Odpoveď od AI

LeakCanary funguje v niekoľkých fázach:

  1. Detekcia únikov: Sleduje životný cyklus sledovaných objektov, ako sú Fragment, Activity, View. Keď takýto objekt zanikne, LeakCanary ho umiestni do slabého odkazu (WeakReference) a spustí garbage collector.
  2. Kontrola odkazu: Po spustení garbage collectora LeakCanary kontroluje, či na objekt stále existuje odkaz. Ak áno, znamená to, že objekt nebol zozbieraný a pravdepodobne došlo k úniku.
  3. Heap dump: V prípade zistenia možného úniku LeakCanary vytvorí dump pamäte (heap dump) aplikácie. Ide o snímku celej pamäte obsadenej objektmi aplikácie v danom momente.
  4. Analýza grafu objektov: LeakCanary analyzuje graf objektov v dumpu pamäte, aby našiel cestu od koreňov GC (GC roots) k podozrivému objektu úniku. Táto cesta ukazuje, prečo objekt nebol zozbieraný.
  5. Generovanie správy: Na základe analýzy LeakCanary generuje správu s podrobnosťami o úniku, vrátane cesty udržiavania objektu (objekt, ktorý drží odkaz na udržiavaný objekt), typu objektu a miesta v kóde, kde pravdepodobne došlo k úniku. Správa sa zobrazí ako oznámenie alebo vnútri aplikácie.
// Príklad jednoduchého sledovania objektu A po jeho zničení
@Override
protected void onDestroy() {
    super.onDestroy();
    // Obalíme objekt do WeakReference a odovzdáme ho LeakCanary
    refWatcher.watch(this);
}

LeakCanary používa vlastné analyzátory a algoritmy na analýzu hprof súborov (formát dumpu heap-u) a efektívne nachádza cesty udržiavania objektov.