Как LeakCanary находит утечки памяти

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

Ответ

LeakCanary обнаруживает утечки памяти, отслеживая объекты, которые должны быть уничтожены, но остаются в памяти. Вот как это работает:

  1. Отслеживание объектов – LeakCanary регистрирует ObjectWatcher, который наблюдает за объектами (например, уничтоженными Activity/Fragment). Если объект не удаляется сборщиком мусора (GC) через 5 секунд, он считается потенциальной утечкой.

  2. Анализ кучи – Если утечка обнаружена, LeakCanary делает дамп кучи (Heap Dump) и анализирует его с помощью Shark (библиотека для анализа кучи). Он ищет цепочки ссылок, удерживающие объект.

  3. Отчет – Показывает кратчайший путь удержания объекта (reference chain), помогая найти корень проблемы.

Пример кода для ручной проверки утечки:

val watchedObject = MyActivity()
AppWatcher.objectWatcher.watch(
    watchedObject,
    "MyActivity should be garbage collected"
)