Sobes.tech
Middle+

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

sobes.tech AI

Antwoord van AI

LeakCanary werkt in verschillende fasen:

  1. Detectie van lekken: Het volgt de levenscyclus van de waargenomen objecten, zoals Fragment, Activity, View. Wanneer zo'n object wordt vernietigd, plaatst LeakCanary het in een zwakke referentie (WeakReference) en start de garbage collector.
  2. Controle van de referentie: Na de garbage collection controleert LeakCanary of er nog een referentie naar het object bestaat. Als dat zo is, betekent dit dat het object niet is verzameld en waarschijnlijk een lek is.
  3. Heap dump: Bij het detecteren van een mogelijk lek maakt LeakCanary een heap dump van de applicatie. Dit is een momentopname van het volledige geheugen dat door de objecten van de applicatie op dat moment wordt ingenomen.
  4. Analyse van de objectgrafiek: LeakCanary analyseert de objectgrafiek in de heap dump om een pad te vinden van de GC-rouws (GC roots) naar het vermoedelijke lek-objekt. Dit pad toont waarom het object niet is verzameld.
  5. Rapportgeneratie: Op basis van de analyse genereert LeakCanary een rapport met details over het lek, inclusief het vasthoudpad van het object (het object dat vasthoudt verwijst naar het vasthoudende object), het type object en de locatie in de code waar het waarschijnlijk is gebeurd. Het rapport wordt weergegeven als een melding of binnen de applicatie.
// Eenvoudig voorbeeld van het volgen van een object A na vernietiging
@Override
protected void onDestroy() {
    super.onDestroy();
    // Wikkel het object in een WeakReference en geef het door aan LeakCanary
    refWatcher.watch(this);
}

LeakCanary gebruikt eigen parsers en algoritmen om hprof-bestanden (heap dump-formaat) te analyseren en effectief de vasthoudpaden van objecten te vinden.