Сборщик мусора (Garbage Collector, GC) в Android — это автоматизированный процесс управления памятью, реализованный в виртуальной машине (Dalvik или ART). Он освобождает память, которую занимают объекты, на которые больше нет активных ссылок из работающей части программы.
Ключевые задачи GC:
- Освобождение неиспользуемой памяти: Отслеживает объекты, которые стали недостижимыми, и делает занятую ими память доступной для новых размещений.
- Предотвращение утечек памяти: Помогает избежать ситуации, когда недостижимые объекты продолжают занимать память, что может привести к OutOfMemoryError.
Принципы работы:
- Фаза маркировки (Mark): GC проходит по графу объектов, достижимых из "корневых" ссылок (например, из активных потоков, статических полей). Он помечает все достижимые объекты.
- Фаза очистки (Sweep): GC просматривает всю кучу и удаляет объекты, которые не были помечены на предыдущем этапе.
Особенности в Android:
- ART (Android Runtime): Современная среда выполнения в Android, которая заменила Dalvik. GC в ART имеет различные реализации и стратегии (например, Concurrent Mark-Sweep) для снижения пауз, необходимых для сборки мусора, что улучшает отзывчивость приложений.
- Оптимизация: Сборщики мусора в Android оптимизированы для мобильных устройств с ограниченными ресурсами памяти.
- Влияние на производительность: Хотя GC автоматизирован, он может вызывать короткие паузы (stop-the-world pauses) во время своих операций, что может повлиять на плавность UI, особенно при интенсивном выделении/освобождении памяти. Современные GC минимизируют это влияние.
Пример утечки памяти, которую GC не может собрать:
java
В данном примере, если getInstance(context) вызывается с контекстом Activity, и MySingleton является синглтоном, который живет дольше Activity, то Activity не может быть собрана GC из-за сильной ссылки на нее из синглтона. Правильное решение - использовать context.getApplicationContext(), так как ApplicationContext живет столько же, сколько и приложение.
GC в Android критически важен для предотвращения проблем с памятью, но разработчику все равно необходимо следить за правильным управлением ссылками, чтобы избежать утечек памяти.