Middle+
Как LeakCanary обнаруживает утечку памяти?
sobes.tech AI
Atsakymas iš AI
LeakCanary veikia keliuose etapuose:
- Nuotėkio aptikimas: Jis stebi stebimų objektų, tokių kaip Fragment, Activity, View, gyvavimo ciklą. Kai toks objektas sunaikinamas, LeakCanary jį įdeda į silpną nuorodą (WeakReference) ir paleidžia šiukšlių surinkėją.
- Nuorodos patikrinimas: Po šiukšlių surinkimo LeakCanary patikrina, ar vis dar yra nuoroda į objektą. Jei taip, tai reiškia, kad objektas nebuvo surinktas ir greičiausiai yra nuotėkis.
- Heap dump: Jei aptinkamas galimas nuotėkis, LeakCanary daro heap dump'ą (atminties iškrovimą) programos. Tai visos atminties, užimtos objektais, momentinė nuotrauka.
- Objektų grafiko analizė: LeakCanary analizuoja heap dump'e esančio objektų grafiką, kad rastų kelią nuo GC šaknų (GC roots) iki įtariamo nuotėkio objekto. Šis kelias rodo, kodėl objektas nebuvo surinktas.
- Ataskaitos generavimas: Remiantis analize, LeakCanary generuoja išsamų ataskaitą apie nuotėkį, įskaitant objekto išlaikymo kelią (objektas, kuris laiko nuorodą į saugomą objektą), objekto tipą ir vietą kode, kur tikėtina, įvyko nuotėkis. Ataskaita rodomas kaip įspėjimas arba programos viduje.
// Pavyzdys paprasto stebėjimo objekto A po jo sunaikinimo
@Override
protected void onDestroy() {
super.onDestroy();
// Objekto įvyniojimas į WeakReference ir perdavimas LeakCanary
refWatcher.watch(this);
}
LeakCanary naudoja savo parserius ir algoritmus, kad efektyviai rastų objektų išlaikymo kelius, analizuodamas hprof failus (atminties iškrovimo formatą).