Ответ
LeakCanary обнаруживает утечки памяти, отслеживая уничтоженные Activity через механизм WeakReference и ReferenceQueue.
-
Механизм отслеживания:
- При уничтожении Activity LeakCanary создает
WeakReferenceна нее и регистрирует вReferenceQueue. - Если после сборки мусора
WeakReferenceостается в очереди, значит, Activity не была освобождена.
- При уничтожении Activity LeakCanary создает
-
Анализ утечки:
- LeakCanary дампывает память (HPROF-файл) и анализирует цепочку ссылок, удерживающих Activity.
- Используется библиотека Shark для парсинга HPROF.
Пример кода (упрощенно):
val refQueue = ReferenceQueue<Any>()
val weakRef = WeakReference(activity, refQueue)
// Проверка после GC
if (weakRef.poll() != null) {
// Утечки нет
} else {
// Есть утечка, дампим память
}