Как работает сборщик мусора (Garbage Collector) в Python?

«Как работает сборщик мусора (Garbage Collector) в Python?» — вопрос из категории Other, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В 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() — пороги для поколений.