Middle+
Как LeakCanary обнаруживает утечку памяти?
sobes.tech АИ
Одговор од АИ
LeakCanary radi u više faza:
- 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.
- 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.
- 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.
- 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.
- 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.