Sobes.tech
Middle+

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

sobes.tech АИ

Одговор од АИ

LeakCanary radi u više faza:

  1. Otkrivanje curenja: Prati životni ciklus posmatranih objekata, kao što su Fragment, Activity, View. Kada takav objekat bude uništen, LeakCanary ga stavlja u slab referencu (WeakReference) i pokreće sakupljač smeća.
  2. Provera reference: Nakon sakupljanja smeća, LeakCanary proverava da li i dalje postoji referenca na objekat. Ako postoji, to znači da objekat nije sakupljen i verovatno je došlo do curenja.
  3. Dump memorije (heap dump): U slučaju otkrivanja moguće curenja, LeakCanary pravi dump memorije aplikacije. To je snimak cele memorije koju zauzimaju objekti aplikacije u datom trenutku.
  4. Analiza grafa objekata: LeakCanary analizira graf objekata u dump-u memorije da bi pronašao put od GC korena (GC roots) do sumnjivog objekta curenja. Ovaj put pokazuje zašto objekat nije sakupljen.
  5. Generisanje izveštaja: Na osnovu analize, LeakCanary generiše izveštaj sa detaljima o curenju, uključujući put zadržavanja objekta (objekat koji drži referencu na zadržani objekat), tip objekta i mesto u kodu gde je verovatno došlo do curenja. Izveštaj se prikazuje kao obaveštenje ili unutar aplikacije.
// Jednostavan primer praćenja objekta A nakon njegovog uništenja
@Override
protected void onDestroy() {
    super.onDestroy();
    // Omotavanje objekta u WeakReference i prosleđivanje LeakCanary-u
    refWatcher.watch(this);
}

LeakCanary koristi sopstvene parser-e i algoritme za analizu hprof fajlova (format dump-a heap-a) kako bi efikasno pronalazio putove zadržavanja objekata.