Назад к вопросам
Middle+
119
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech 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-файлов (формат дампа хипа), чтобы эффективно находить пути удержания объектов.