Middle+
Как LeakCanary обнаруживает утечку памяти?
sobes.tech AI
Απάντηση από AI
Το LeakCanary λειτουργεί σε διάφορα στάδια:
- Εντοπισμός διαρροών: Παρακολουθεί τον κύκλο ζωής των παρατηρούμενων αντικειμένων, όπως Fragment, Activity, View. Όταν ένα τέτοιο αντικείμενο καταστρέφεται, το LeakCanary το τοποθετεί σε μια αδύναμη αναφορά (WeakReference) και ενεργοποιεί τον συλλέκτη απορριμμάτων.
- Έλεγχος της αναφοράς: Μετά τον συλλέκτη απορριμμάτων, το LeakCanary ελέγχει αν υπάρχει ακόμα αναφορά στο αντικείμενο. Αν ναι, αυτό σημαίνει ότι το αντικείμενο δεν έχει συλλεχθεί και πιθανώς υπάρχει διαρροή.
- Αποθήκευση μνήμης (heap dump): Σε περίπτωση εντοπισμού πιθανής διαρροής, το LeakCanary κάνει ένα dump της μνήμης της εφαρμογής. Είναι μια στιγμιότυπο όλης της μνήμης που καταλαμβάνουν τα αντικείμενα της εφαρμογής σε μια δεδομένη στιγμή.
- Ανάλυση του γραφήματος αντικειμένων: Το LeakCanary αναλύει το γράφημα αντικειμένων στο dump της μνήμης για να βρει ένα μονοπάτι από τις ρίζες GC (GC roots) μέχρι το υποψήφιο αντικείμενο διαρροής. Αυτό το μονοπάτι δείχνει γιατί το αντικείμενο δεν έχει συλλεχθεί.
- Παραγωγή αναφοράς: Βάσει της ανάλυσης, το LeakCanary δημιουργεί μια αναφορά με λεπτομέρειες σχετικά με τη διαρροή, συμπεριλαμβανομένου του μονοπατιού διατήρησης του αντικειμένου (το αντικείμενο που διατηρεί αναφορά στο διατηρούμενο αντικείμενο), του τύπου του αντικειμένου και του σημείου στον κώδικα όπου πιθανώς συνέβη η διαρροή. Η αναφορά εμφανίζεται ως ειδοποίηση ή μέσα στην εφαρμογή.
// Απλό παράδειγμα παρακολούθησης ενός αντικειμένου A μετά την καταστροφή του
@Override
protected void onDestroy() {
super.onDestroy();
// Τυλίγουμε το αντικείμενο σε μια WeakReference και το περνάμε στο LeakCanary
refWatcher.watch(this);
}
Το LeakCanary χρησιμοποιεί τους δικούς του αναλυτές και αλγόριθμους για την ανάλυση αρχείων hprof (μορφή αποθήκευσης μνήμης) και βρίσκει αποτελεσματικά μονοπάτια διατήρησης αντικειμένων.