LeakCanary работает в несколько этапов:
- Обнаружение утечки: Он отслеживает жизненный цикл наблюдаемых объектов, таких как Fragment, Activity, View. Когда такой объект уничтожается, LeakCanary помещает его в слабую ссылку (WeakReference) и запускает сборщик мусора.
- Проверка наличия ссылки: После сборки мусора LeakCanary проверяет, осталась ли ссылка на объект. Если ссылка все еще существует, это означает, что объект не был собран и, вероятно, произошла утечка.
- Дамп хипа: В случае обнаружения возможной утечки, LeakCanary делает дамп хипа (heap dump) приложения. Это снимок всей памяти, занимаемой объектами приложения в определенный момент времени.
- Анализ графа объектов: LeakCanary анализирует граф объектов в дампе хипа, чтобы найти путь от корней сборщика мусора (GC roots) до объекта, предположительно утекающего. Этот путь показывает, почему объект не был собран.
- Отображение отчета: На основе анализа LeakCanary генерирует отчет с подробной информацией об утечке, включая путь удержания объекта (держащий объект ссылается на удерживаемый объект), тип объекта и место в коде, где, вероятно, произошла утечка. Отчет отображается в виде уведомления или внутри приложения.
java
LeakCanary использует свои собственные парсеры и алгоритмы для анализа hprof-файлов (формат дампа хипа), чтобы эффективно находить пути удержания объектов.