Middle+
Как LeakCanary обнаруживает утечку памяти?
sobes.tech AI
Отговор от AI
LeakCanary работи на няколко етапа:
- Обнаружаване на течове: Следи жизнения цикъл на наблюдаваните обекти като Fragment, Activity, View. Когато такъв обект бъде унищожен, LeakCanary го поставя в слаба препратка (WeakReference) и стартира събирача на боклука.
- Проверка на препратката: След събирача на боклука LeakCanary проверява дали все още съществува препратка към обекта. Ако да, това означава, че обектът не е бил събран и вероятно има теч.
- Дамп на хипа: В случай на откриване на възможен теч, LeakCanary прави дамп на паметта (heap dump) на приложението. Това е снимка на цялата памет, заета от обектите на приложението в даден момент.
- Анализ на графа на обектите: LeakCanary анализира графа на обектите в дампа на паметта, за да намери път от корените на събирача на боклука (GC roots) до предполагаемия течен обект. Този път показва защо обектът не е бил събран.
- Генериране на доклад: Въз основа на анализа LeakCanary генерира доклад с подробна информация за теча, включително пътя на задържане на обекта (обектът, който задържа препратка към задържания обект), типа на обекта и мястото в кода, където вероятно е станал течът. Докладът се показва като известие или вътре в приложението.
// Прост пример за проследяване на обект A след неговото унищожаване
@Override
protected void onDestroy() {
super.onDestroy();
// Обвиване на обекта в WeakReference и предаването му към LeakCanary
refWatcher.watch(this);
}
LeakCanary използва свои собствени парсери и алгоритми за анализ на hprof файлове (формат за дамп на хип) за ефективно намиране на пътищата за задържане на обекти.