Что может выступать корневым элементом для сборщика мусора
Что проверяют
Понимаете ли вы, как виртуальная машина решает, что объект живой. Это база под разговор об утечках: пока вы не назовёте корни, диагностика сводится к догадкам, а утечка активити это самый частый источник роста памяти в андроиде.
Как отвечать
Корень это точка, с которой начинается обход достижимости. Всё, до чего можно дойти по ссылкам от корней, считается живым, остальное собирается. Корнями выступают:
- локальные переменные и параметры в кадрах стека всех живых потоков, а также сами объекты потоков;
- статические поля загруженных классов и константы, пока жив загрузчик класса;
- глобальные ссылки из нативного кода через JNI;
- объекты, на которых сейчас удерживается монитор в
synchronized; - объекты, ожидающие финализации.
Дальше переведите это в практику. Статическое поле со ссылкой на Context или синглтон, которому передали активити, держат её вечно. Живой поток, Handler с отложенным сообщением или неснятый слушатель тоже корни: они держат внешний объект, поэтому анонимный класс внутри активити переживает поворот экрана вместе с ней.
Полезно упомянуть, что инструменты поиска утечек показывают именно цепочку от корня до утёкшего объекта, и читать надо её, а не общий график памяти.
Где спотыкаются
Называют корнями компоненты приложения: активити, сервис, элементы фреймворка. Активити не корень, её удерживают ссылки, и вся диагностика как раз состоит в поиске того, кто её держит. Ответ «активити живёт, потому что она системная» закрывает дорогу к настоящей причине.
Путают достижимость с полезностью. Объект в статическом кэше, в списке слушателей или в очереди сообщений достижим, значит не будет собран, хотя логически давно не нужен. Утечка в управляемой среде это лишняя живая ссылка, а не потерянный указатель.
Считают, что ссылку достаточно обнулить, а потом позвать сборку. Обнуление помогает, только если это была последняя ссылка, а вызов сборки мусора остаётся просьбой, а не командой. Слабые ссылки тоже не универсальное лекарство: они снимают удержание, но не чинят логику, из-за которой объект попал в долгоживущее место.