Sobes.tech
Middle+

Πώς ανιχνεύει το LeakCanary τις αναφορές σε καταστραμμένες Activities;

sobes.tech AI

Απάντηση από AI

Το LeakCanary χρησιμοποιεί μια αδύναμη (Phantom Reference) ή ισχυρή (Strong Reference) αναφορά σε μια ειδική παρατηρητή που "ακούει" τον κύκλο ζωής της Activity. Όταν η Activity καταστρέφεται, το LeakCanary καταγράφει τον χρόνο και περιμένει τη συλλογή απορριμμάτων. Αν μετά τη συλλογή απορριμμάτων το αντικείμενο Activity εξακολουθεί να υπάρχει στη μνήμη, το LeakCanary ξεκινά μια αποθήκευση μνήμης (heap dump), την αναλύει και δημιουργεί ένα γράφημα προσβασιμότητας για να βρει το μονοπάτι από τις GC Roots σε αυτό το "διαρρέον" Activity.

Βασικά βήματα:

  1. Παρακολούθηση του κύκλου ζωής: Το LeakCanary καταγράφει ActivityLifecycleCallbacks.
  2. Σημείωση (Bookmarking): Κατά την κλήση onDestroy(), το LeakCanary δημιουργεί μια αναφορά στην Activity (ανάλογα με την έκδοση) και καταγράφει τον χρόνο.
  3. Αναμονή για GC: Το LeakCanary περιμένει να πραγματοποιηθεί η συλλογή απορριμμάτων για να ελέγξει αν το αντικείμενο έχει καταστραφεί.
  4. Έλεγχος μετά το GC: Αν το αντικείμενο Activity είναι ακόμα προσβάσιμο μετά το GC, υποδεικνύει μια πιθανή διαρροή.
  5. Heap dump: Το LeakCanary καλεί Debug.dumpHprofData() για να αποθηκεύσει την τρέχουσα κατάσταση της μνήμης.
  6. Ανάλυση του dump: Το LeakCanary (μέσω του Memory Analyzer Tool (MAT) ή του δικού του αναλυτή) σαρώνει το dump μνήμης.
  7. Αναζήτηση διαδρομής: Το εργαλείο βρίσκει διαδρομές στο γράφημα αντικειμένων από τις GC Roots μέχρι το "διαρρέον" αντικείμενο.
  8. Αναφορά: Το LeakCanary δημιουργεί μια αναγνώσιμη αναφορά που δείχνει τη σειρά των αναφορών που διατηρούν το αντικείμενο μακριά από τη συλλογή απορριμμάτων.