Ответ
Garbage Collector в Android (ART/Dalvik) использует поколенческую сборку мусора. Основные этапы:
-
Marking - GC помечает все достижимые объекты, начиная с GC Roots (активные потоки, статические поля и т.д.)
-
Sweeping - удаляются неотмеченные (недостижимые) объекты
-
Compacting (опционально) - живые объекты перемещаются для дефрагментации кучи
Пример с утечкой памяти:
class LeakyActivity : Activity() {
private val leak = mutableListOf<Any>()
override fun onCreate() {
repeat(100_000) {
leak.add(ByteArray(1024)) // Утечка - список держит ссылки
}
}
}
Нюансы:
- Молодое поколение (young gen) собирается чаще (minor GC)
- Старое поколение (old gen) собирается реже (major GC)
- Stop-the-world паузы (в ART короче, чем в Dalvik)