Ответ
Циклические ссылки (когда объекты ссылаются друг на друга) не удаляются автоматически сборщиком мусора (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, несмотря на цикл. Однако если хотя бы один объект в цикле достижим (например, через статическое поле), вся группа останется в памяти.