Как LeakCanary находит ссылку на уничтоженную Activity

«Как LeakCanary находит ссылку на уничтоженную Activity» — вопрос из категории Управление памятью, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

LeakCanary обнаруживает утечки памяти, отслеживая уничтоженные Activity через механизм WeakReference и ReferenceQueue.

  1. Механизм отслеживания:

    • При уничтожении Activity LeakCanary создает WeakReference на нее и регистрирует в ReferenceQueue.
    • Если после сборки мусора WeakReference остается в очереди, значит, Activity не была освобождена.
  2. Анализ утечки:

    • LeakCanary дампывает память (HPROF-файл) и анализирует цепочку ссылок, удерживающих Activity.
    • Используется библиотека Shark для парсинга HPROF.

Пример кода (упрощенно):

val refQueue = ReferenceQueue<Any>()
val weakRef = WeakReference(activity, refQueue)

// Проверка после GC
if (weakRef.poll() != null) {
    // Утечки нет
} else {
    // Есть утечка, дампим память
}