Ответ
Garbage Collector в Android (начиная с ART) использует алгоритм Mark-and-Sweep:
-
Mark (Пометка)
Проходит по всем достижимым объектам, начиная с GC Roots (активные потоки, статические поля, локальные переменные), и помечает их как живые. -
Sweep (Очистка)
Удаляет все объекты, которые не были помечены (недостижимые).
Пример утечки памяти:
class LeakyActivity : Activity() {
private val leak = SomeSingleton.getInstance(this) // Активность удерживается синглтоном
}
Нюансы:
- Generational Collection – объекты делятся на молодые (часто удаляются) и старые (редко).
- Concurrent GC – работает параллельно с приложением, минимизируя лаги.
- Finalization – перед удалением вызывается
finalize(), но это deprecated с API 28.
Для отладки утечек используйте LeakCanary или Android Profiler.