← Назад к вопросам
Как работает сборщик мусора (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