← Назад к вопросам

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

2.4 Senior🔥 181 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как работает сборщик мусора в Python

Сборщик мусора (Garbage Collector, GC) в Python отвечает за автоматическое освобождение памяти от неиспользуемых объектов. Это критически важно для стабильности долгоживущих приложений.

Механизм подсчёта ссылок (Reference Counting)

Основной механизм в Python — подсчёт ссылок. Каждый объект имеет счётчик, который увеличивается и уменьшается при создании и удалении ссылок:

import sys

class MyClass:
    pass

obj = MyClass()
print(sys.getrefcount(obj))  # 2 (одна ссылка в obj, одна внутри getrefcount)

ref1 = obj
print(sys.getrefcount(obj))  # 3 — добавилась ещё одна ссылка

del ref1
print(sys.getrefcount(obj))  # 2 — ссылка удалена

del obj
# Объект удалён — счётчик достиг 0, вызовется __del__

Когда счётчик ссылок становится равен 0, объект немедленно удаляется из памяти.

Проблема циклических ссылок

Проблема возникает при циклических ссылках — когда объекты ссылаются друг на друга:

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None
    
    def __del__(self):
        print(f"Node {self.value} удалён")

node1 = Node(1)
node2 = Node(2)

node1.next = node2
node2.next = node1  # Циклическая ссылка!

del node1
del node2
# Объекты не удалены! Счётчики остаются > 0
# Их удалит сборщик мусора

Cyclic GC — сборщик циклических ссылок

Для обнаружения и удаления циклических ссылок Python имеет поколенческий сборщик мусора. Он работает автоматически и делит объекты на 3 поколения:

import gc

# Поколение 0 — молодые объекты
# Поколение 1 — пережившие одну сборку
# Поколение 2 — долгоживущие объекты

print(gc.get_threshold())  # (700, 10, 10) — параметры сборки

# Информация о сборках
print(gc.get_count())  # (счёт0, счёт1, счёт2)

Контроль сборщика мусора

import gc

# Получить информацию об объектах
objects = gc.get_objects()
print(f"Всего объектов: {len(objects)}")

# Отследить мусор
gc.set_debug(gc.DEBUG_SAVEALL)
gc.collect()
print(f"Объектов в garbage: {len(gc.garbage)}")

# Получить объекты определённого типа
def get_objects_of_type(type_name):
    return [o for o in gc.get_objects() if type(o).__name__ == type_name]

print(get_objects_of_type('dict'))

Резюме

  • Reference Counting — основной механизм, удаляет объекты немедленно
  • Cyclic GC — обнаруживает и удаляет циклические ссылки
  • Поколенческая сборка — оптимизирует производительность
  • Для сложных случаев используй weakref и ручной контроль через модуль gc