Sobes.tech
Middle+

Kuidas LeakCanary tuvastab viited hävitatud Activity'idele?

sobes.tech AI

Vastus AI-lt

LeakCanary kasutab nõrka (Phantom Reference) või tugevat (Strong Reference) viidet spetsiaalses jälgijas, mis "kuulab" Activity elutsüklit. Kui Activity hävitatakse, registreerib LeakCanary aja ja ootab prügikoristust. Kui prügikoristus on toimunud ja Activity objekt on endiselt mälus, alustab LeakCanary mälu dumpi (heap dump), analüüsib seda ja loob kättesaadavusgraafi, et leida tee GC juurtest selle "lekkinud" Activity juurde.

Põhietapid:

  1. Elutsükli jälgimine: LeakCanary registreerib ActivityLifecycleCallbacks.
  2. Märkimine (Bookmarking): onDestroy() kutsumisel loob LeakCanary viite Activity-le (sõltuvalt versioonist) ja registreerib aja.
  3. GC ootamine: LeakCanary ootab, kuni toimub prügikoristus, et kontrollida, kas objekt on hävitatud.
  4. Pärast GC kontroll: Kui Activity objekt on endiselt kättesaadav pärast GC-d, näitab see potentsiaalset lekkimist.
  5. Heap dump: LeakCanary kutsub Debug.dumpHprofData(), et salvestada praegune mäluolukord.
  6. Dump analüüs: LeakCanary (Memory Analyzer Tool (MAT) või oma analüütiku kaudu) skaneerib heap dump-i.
  7. Tee otsimine: Tööriist leiab teed objektide graafikus GC juurtest kuni "lekkinud" objektini.
  8. Aruanne: LeakCanary genereerib loetava aruande, mis näitab viidete ahelat, mis hoiab objekti eemal prügikoristusest.