Удаляются ли циклические ссылки

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

Ответ

Циклические ссылки (когда объекты ссылаются друг на друга) не удаляются автоматически сборщиком мусора (GC) в Java/Kotlin. GC использует алгоритм mark-and-sweep, который помечает достижимые объекты, начиная с корневых (например, статические поля, активные потоки). Если циклическая группа объектов недостижима из корней, она будет удалена.

Пример:

class Node(var next: Node? = null)

fun createCycle() {
    val a = Node()
    val b = Node(a)
    a.next = b // Цикл: a → b → a
}

После выхода из createCycle() оба объекта станут недостижимы и будут собраны GC, несмотря на цикл. Однако если хотя бы один объект в цикле достижим (например, через статическое поле), вся группа останется в памяти.