Как Garbage Collector может потерять ссылку на объект в памяти

«Как Garbage Collector может потерять ссылку на объект в памяти» — вопрос из категории Управление памятью, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Garbage Collector (GC) в Android (через ART/Dalvik) теряет ссылки на объекты, когда они больше не достижимы из активных корневых точек (например, статических полей, активных потоков, стеков вызовов). Основные сценарии:

  1. Обнуление ссылок:
var obj = MyObject()
obj = null // GC соберет MyObject
  1. Выход из области видимости:
fun createTemp() {
    val temp = Temporary()
    // temp становится недостижимым после return
}
  1. Циклические ссылки без внешних связей:
class Node {
    var next: Node? = null
}

val a = Node()
val b = Node()
a.next = b
b.next = a
a = null
b = null // Оба объекта будут собраны, несмотря на циклическую ссылку

GC использует алгоритм mark-and-sweep: сначала помечает достижимые объекты, затем удаляет все непомеченные. WeakReference/SoftReference могут специально "ослаблять" ссылки для более гибкого управления памятью.