Олег Марков
Как работает сборщик мусора в Python
Введение
Управление памятью в Python реализуется автоматически с помощью сборщика мусора (Garbage Collector). Он освобождает память, занятую объектами, которые больше не используются, предотвращая утечки памяти и обеспечивая стабильную работу приложений.
В этой статье мы рассмотрим, как Python определяет, какие объекты можно удалить, как работают подсчет ссылок и алгоритмы для сборки циклических объектов.
Если вы хотите детальнее изучить работу Python с объектами, памятью и ссылками — приходите на наш курс Основы Python. На курсе 209 уроков и 34 упражнения, AI-тренажеры для практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.
Подсчет ссылок (Reference Counting)
Каждый объект в Python хранит счетчик ссылок — количество переменных, указывающих на объект. Когда счетчик становится равным нулю, объект удаляется:
import sys
a = [1, 2, 3]
print(sys.getrefcount(a)) # Например, 2 (счётчик включает временную ссылку функции getrefcount)
b = a
print(sys.getrefcount(a)) # 3
del a
print(sys.getrefcount(b)) # 2Недостаток подсчета ссылок — невозможность обнаружить циклические ссылки (объекты, ссылающиеся друг на друга).
Циклический сборщик (Cycle Collector)
Python использует модуль gc для обнаружения циклов объектов, которые недоступны извне, но содержат ссылки друг на друга:
import gc
class Node:
def __init__(self):
self.ref = None
a = Node()
b = Node()
a.ref = b
b.ref = a
del a
del b
gc.collect() # Принудительно запускаем сборщик цикловСборщик циклов помогает предотвратить утечки памяти в структурах с взаимными ссылками.
Настройка сборщика мусора
Модуль gc позволяет:
- Отключать/включать автоматическую сборку:
gc.disable()
gc.enable()- Получать информацию о поколениях и объектных подсчетах:
print(gc.get_count()) # Количество объектов в поколениях- Принудительно запускать сборку:
gc.collect()Практические рекомендации
- Избегайте создания больших циклических структур без необходимости.
- Для временных объектов используйте неизменяемые типы или слабые ссылки (
weakref). - При работе с ресурсами, требующими освобождения (файлы, соединения) используйте контекстные менеджеры (
with).
Частые ошибки
- Полагаться только на подсчет ссылок и игнорировать циклы.
- Создавать объекты с циклами, которые долго живут, не используя сборщик мусора.
- Ожидать немедленного удаления объекта после
del. Сборка может происходить позже.
Часто задаваемые вопросы
Почему объект не удаляется после del? Если на объект ещё есть ссылки или он участвует в цикле, сборка произойдет позже.
Можно ли полностью отключить сборщик мусора? Да, через
gc.disable(), но тогда нужно вручную следить за памятью.Как проверить объекты, не собранные сборщиком?
import gc
print(gc.garbage) # Список объектов, которые не удалось собратьЗаключение
Сборщик мусора — ключевой инструмент Python для управления памятью. Он сочетает подсчет ссылок и сборку циклических объектов, обеспечивая автоматическое освобождение памяти. Понимание его работы помогает оптимизировать использование памяти и избегать утечек в сложных приложениях.
Для системного изучения работы с памятью, объектами и ссылками рекомендую пройти курс Основы Python. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в мир Python прямо сегодня.
Постройте личный план изучения Python до уровня Middle — бесплатно!
Python — часть карты развития Backend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Все гайды по Python
Лучшие курсы по теме

Основы Python
Антон Ларичев
Nest.js с нуля
Антон Ларичев