Назад к вопросам
Middle+
67
questionbank
Как LeakCanary определяет ссылки на уничтоженные Activity?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
LeakCanary использует слабое (Phantom Reference) или сильное (Strong Reference) ссылочное поле в специальном Observer, который "слушает" жизненный цикл Activity. Когда Activity уничтожается, LeakCanary фиксирует время и ждет сборки мусора. Если после сборки мусора объект Activity все еще существует в памяти, LeakCanary инициирует дамп кучи (heap dump), анализирует его и строит граф достижимости, чтобы найти путь от GC Roots к этому "утекшему" Activity.
Ключевые шаги:
- Наблюдение за жизненным циклом: LeakCanary регистрирует
ActivityLifecycleCallbacks. - Закладка (Bookmarking): При вызове
onDestroy(), LeakCanary создает ссылку на Activity (зависит от версии) и записывает отметку времени. - Ожидание GC: LeakCanary ждет наступления сборки мусора, чтобы проверить, был ли объект уничтожен.
- Проверка после GC: Если объект Activity все еще доступен после сборки мусора, это указывает на потенциальную утечку.
- Дамп кучи: LeakCanary вызывает
Debug.dumpHprofData()для сохранения текущего состояния памяти. - Анализ дампа: LeakCanary (через Memory Analyzer Tool (MAT) или свой анализатор) сканирует дамп кучи.
- Поиск пути: Инструмент находит пути в графе объектов от корневых элементов сборщика мусора (GC Roots) до "утекшего" объекта Activity.
- Отчет: LeakCanary генерирует читаемый отчет, показывающий цепочку ссылок, которая удерживает объект от сборки мусора.