Ответ
В Python используется сборщик мусора на основе подсчета ссылок с дополнительным циклическим сборщиком для обнаружения недостижимых объектов.
Основной механизм (подсчет ссылок):
- Каждый объект имеет счетчик ссылок.
- При создании новой ссылки счетчик увеличивается, при удалении — уменьшается.
- Когда счетчик достигает нуля, память объекта немедленно освобождается.
Циклический сборщик (Generational GC):
- Обнаруживает и удаляет циклические ссылки (когда объекты ссылаются друг на друга, но недоступны извне).
- Использует поколения (0, 1, 2). Новые объекты попадают в поколение 0.
- Чаще проверяет молодые поколения, реже — старые.
Пример цикла:
class Node:
def __init__(self):
self.ref = None
# Создание циклической ссылки
a = Node()
b = Node()
a.ref = b
b.ref = a
# Удаляем внешние ссылки
a = None
b = None
# Теперь объекты недостижимы, но счетчики ссылок не нулевые.
# Их удалит циклический сборщик.
Управление GC:
gc.enable()/gc.disable()— включить/выключить.gc.collect()— принудительный запуск.gc.get_threshold()— пороги для поколений.