Sobes.tech
Middle+

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

sobes.tech AI

Отговор от AI

LeakCanary работи на няколко етапа:

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

LeakCanary използва свои собствени парсери и алгоритми за анализ на hprof файлове (формат за дамп на хип) за ефективно намиране на пътищата за задържане на обекти.