Как сборщик мусора работает с циклическими ссылками
Python
Senior
VK
Как сборщик мусора работает с циклическими ссылками
Ответы
Python использует алгоритм подсчета ссылок в сочетании с generational garbage collector (GC) для обработки циклических ссылок. Когда объекты ссылаются друг на друга, но нет внешних ссылок, их счетчик ссылок никогда не достигнет нуля. GC выявляет такие изолированные циклы и удаляет их.
Пример циклической ссылки:
```
class Node:
def __init__(self):
self.ref = None
a = Node()
b = Node()
a.ref = b
b.ref = a # Циклическая ссылка
a = b = None # Теперь объекты изолированы
```
GC работает в 3 поколениях (0, 1, 2). Новые объекты попадают в поколение 0. Если они выживают сборку мусора, переходят в следующее поколение. Для циклических ссылок используется алгоритм mark-and-sweep: помечает достижимые объекты, затем удаляет непомеченные.