Как Python удаляет объекты: зачем нужен сборщик мусора
В предыдущей статье мы разобрали, как работает подсчёт ссылок в Python. Оказалось, что механизм оказался удивительно простым: пока объект имеет хотя бы одну ссылку, он остаётся в памяти. Как только последняя ссылка исчезает, память освобождается.
Кажется, всё просто — но не совсем
На первый взгляд, этого механизма хватит для управления памятью. Однако давайте рассмотрим пример, где всё оказывается не так очевидно.
Создадим два списка:
a = []
b = []
a.append(b)
b.append(a)
Ничего странного? Похоже, нет. Мы просто создали два пустых списка и добавили каждый в другой. Но теперь они образовали замкнутый цикл: первый содержит ссылку на второй, а второй — на первый.
Что происходит после удаления имён?
Теперь удалим переменные:
del a
del b
Имена больше не существуют. Программа не может получить доступ к этим спискам. Но сами объекты по-прежнему живы — каждый хранит ссылку на другого. Счётчики ссылок не опускаются до нуля. Каждый объект продолжает «держать» другой, и ни один из них не может быть освобождён через подсчёт ссылок.
Получается парадокс: объекты недоступны, но память не освобождается. Если бы использовался только подсчёт ссылок, такие объекты оставались бы в памяти до конца работы программы.
Решение — сборщик мусора
К счастью, в Python есть дополнительный механизм — сборщик мусора (Garbage Collector). Он не заменяет подсчёт ссылок, а дополняет его.
Сборщик мусора периодически проверяет, есть ли объекты, до которых программа уже не может добраться, даже если их счётчики ссылок больше нуля. Если такие объекты находятся, они удаляются вместе со всеми внутренними ссылками.
Благодаря этому циклические ссылки не вызывают утечек памяти. Сборщик мусора находит «забытые островки» — объекты, которые потеряны из виду, но ещё занимают место в памяти.
Два механизма работают вместе
Подсчёт ссылок отвечает за быстрое освобождение большинства объектов. Сборщик мусора действует реже, но важнее в сложных случаях. В повседневной работе вы, скорее всего, никогда не заметите его работу — он активен лишь тогда, когда нужно.
Если бы такого механизма не было, любая программа с циклическими ссылками постепенно расходовала бы всё больше памяти. А это серьёзная проблема.
Путь к пониманию: от имён к памяти
Теперь мы видим, как всё складывается воедино: переменные — это имена, которые ссылаются на объекты. Одна переменная может указывать на несколько объектов. Изменение объекта не создаёт новый, если возможно изменение по ссылке. Команда del удаляет имя, а не объект. Подсчёт ссылок помогает следить за жизнью объектов. А сборщик мусора решает задачи, которые невозможно решить только счётчиком.
Эта система позволяет эффективно управлять памятью без лишней сложности.
Следующий шаг: где хранятся имена?
Мы уже много раз говорили, что имя ссылается на объект. Но где именно хранятся эти имена? Почему одна и та же переменная доступна в функции, а в другом месте — нет? И как Python выбирает нужную переменную, если одно и то же имя встречается в разных частях программы?
Об этом мы поговорим в следующем материале.

Оставить комментарий
Вы должны войти чтобы комментировать..