gc.md
1> **Источник:** https://python-all.ru/2.7/library/gc.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 28.12. [`gc`](https://python-all.ru/2.7/library/gc.html#module-gc) – Интерфейс сборщика мусора89Этот модуль предоставляет интерфейс к необязательному сборщику мусора. Он позволяет отключить сборщик, настроить частоту сборки и установить параметры отладки. Также он предоставляет доступ к недостижимым объектам, которые сборщик нашел, но не может освободить. Поскольку сборщик дополняет подсчёт ссылок, уже используемый в Python, его можно отключить, если программа не создаёт циклических ссылок. Автоматическую сборку можно отключить вызовом `gc.disable()`. Для отладки утекающей программы вызовите `gc.set_debug(gc.DEBUG_LEAK)`. Обратите внимание, что это включает `gc.DEBUG_SAVEALL`, что приводит к сохранению собранных объектов в gc.garbage для проверки.1011Модуль [`gc`](https://python-all.ru/2.7/library/gc.html#module-gc) предоставляет следующие функции:1213#### `gc.enable()`1415Включить автоматическую сборку мусора.1617#### `gc.disable()`1819Отключить автоматическую сборку мусора.2021#### `gc.isenabled()`2223Возвращает истину, если автоматическая сборка включена.2425#### `gc.collect([generation])`2627Без аргументов выполняет полную сборку. Необязательный аргумент *поколение* может быть целым числом, указывающим, какое поколение собирать (от 0 до 2). Если номер поколения неверен, вызывается исключение [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError). Возвращается количество найденных недостижимых объектов.2829Изменено в версии 2.5: Добавлен необязательный аргумент *generation*.3031Изменено в версии 2.6: Списки свободной памяти (free lists), поддерживаемые для ряда встроенных типов, очищаются при каждом полном сборе или сборе самого старшего поколения (2). Не все элементы в некоторых списках свободной памяти могут быть освобождены из-за особенностей реализации, в частности [`int`](https://python-all.ru/2.7/library/functions.html#int) и [`float`](https://python-all.ru/2.7/library/functions.html#float).3233#### `gc.set_debug(flags)`3435Устанавливает флаги отладки сборщика мусора. Отладочная информация будет записываться в `sys.stderr`. См. ниже список флагов отладки, которые можно комбинировать с помощью битовых операций для управления отладкой.3637#### `gc.get_debug()`3839Возвращает текущие установленные флаги отладки.4041#### `gc.get_objects()`4243Возвращает список всех объектов, отслеживаемых сборщиком, за исключением возвращаемого списка.4445Новое в версии 2.2.4647#### `gc.set_threshold(threshold0[, threshold1[, threshold2]])`4849Устанавливает пороги сборки мусора (частоту сборки). Установка *threshold0* в ноль отключает сборку.5051Сборщик мусора классифицирует объекты по трём поколениям в зависимости от того, сколько циклов сборки они пережили. Новые объекты помещаются в самое молодое поколение (поколение `0`). Если объект переживает сборку, он перемещается в следующее более старое поколение. Поскольку поколение `2` является самым старым, объекты в этом поколении остаются там после сборки. Чтобы решить, когда запускаться, сборщик отслеживает количество выделений и освобождений объектов с момента последней сборки. Когда количество выделений минус количество освобождений превышает *threshold0*, начинается сборка. Изначально проверяется только поколение `0`. Если поколение `0` проверялось более *threshold1* раз с тех пор, как проверялось поколение `1`, то также проверяется поколение `1`. Аналогично, *threshold2* управляет количеством сборок поколения `1` перед сборкой поколения `2`.5253#### `gc.get_count()`5455Возвращает текущие счётчики сборок в виде кортежа из `(count0, count1, count2)`.5657Новое в версии 2.5.5859#### `gc.get_threshold()`6061Возвращает текущие пороговые значения сборок в виде кортежа из `(threshold0, threshold1, threshold2)`.6263#### `gc.get_referrers(*objs)`6465Возвращает список объектов, которые напрямую ссылаются на любой из objs. Эта функция находит только те контейнеры, которые поддерживают сборку мусора; типы расширений, которые ссылаются на другие объекты, но не поддерживают сборку мусора, найдены не будут.6667Обратите внимание, что объекты, на которые уже нет ссылок, но которые находятся в циклах и ещё не собраны сборщиком мусора, могут оказаться среди возвращаемых ссылающихся объектов. Чтобы получить только живые объекты, вызовите [`collect()`](https://python-all.ru/2.7/library/gc.html#gc.collect) перед вызовом [`get_referrers()`](https://python-all.ru/2.7/library/gc.html#gc.get_referrers).6869Следует соблюдать осторожность при использовании объектов, возвращаемых [`get_referrers()`](https://python-all.ru/2.7/library/gc.html#gc.get_referrers), поскольку некоторые из них могут всё ещё находиться в процессе конструирования и, следовательно, во временно недопустимом состоянии. Избегайте использования [`get_referrers()`](https://python-all.ru/2.7/library/gc.html#gc.get_referrers) для каких-либо целей, кроме отладки.7071Новое в версии 2.2.7273#### `gc.get_referents(*objs)`7475Возвращает список объектов, на которые напрямую ссылается любой из аргументов. Возвращаемые референты – это объекты, посещённые C-уровневыми методами [`tp_traverse`](https://python-all.ru/2.7/c-api/typeobj.html#c.PyTypeObject.tp_traverse) аргументов (если они есть), и это могут быть не все объекты, действительно достижимые напрямую. Методы [`tp_traverse`](https://python-all.ru/2.7/c-api/typeobj.html#c.PyTypeObject.tp_traverse) поддерживаются только объектами, которые поддерживают сборку мусора, и от них требуется только посещение объектов, которые могут участвовать в циклах. Так, например, если целое число напрямую достижимо из аргумента, этот целочисленный объект может как появиться в результирующем списке, так и нет.7677Новое в версии 2.3.7879#### `gc.is_tracked(obj)`8081Возвращает `True`, если объект в настоящее время отслеживается сборщиком мусора, и `False` в противном случае. Как правило, экземпляры атомарных типов не отслеживаются, а экземпляры неатомарных типов (контейнеры, пользовательские объекты и т.д.) отслеживаются. Однако могут присутствовать некоторые оптимизации для конкретных типов, чтобы уменьшить влияние на сборщик мусора простых экземпляров (например, словарей, содержащих только атомарные ключи и значения):8283```python84>>> gc.is_tracked(0)85False86>>> gc.is_tracked("a")87False88>>> gc.is_tracked([])89True90>>> gc.is_tracked({})91False92>>> gc.is_tracked({"a": 1})93False94>>> gc.is_tracked({"a": []})95True96```9798Новое в версии 2.7.99100Следующая переменная предоставляется для доступа только для чтения (можно изменять её значение, но не следует переназначать её):101102#### `gc.garbage`103104Список объектов, которые сборщик счёл недостижимыми, но не смог освободить (несобираемые объекты). По умолчанию этот список содержит только объекты с методами [`__del__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__del__). [1](https://python-all.ru/2.7/library/gc.html#id2) Объекты, имеющие методы [`__del__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__del__) и являющиеся частью цикла ссылок, делают весь цикл ссылок несобираемым, включая объекты, не обязательно находящиеся в этом цикле, но достижимые только из него. Python не собирает такие циклы автоматически, потому что, как правило, невозможно угадать безопасный порядок выполнения методов [`__del__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__del__). Если вам известен безопасный порядок, можно принудительно решить проблему, изучив список *garbage* и явно разорвав циклы, образованные вашими объектами в этом списке. Обратите внимание, что эти объекты всё равно остаются живыми из-за нахождения в списке *garbage*, поэтому их следует также удалить из *garbage*. Например, после разрыва циклов выполните `del gc.garbage[:]`, чтобы очистить список. Вообще говоря, лучше избегать этой проблемы, не создавая циклы, содержащие объекты с методами [`__del__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__del__); в этом случае можно проверить *garbage*, чтобы убедиться, что такие циклы не создаются.105106Если установлен [`DEBUG_SAVEALL`](https://python-all.ru/2.7/library/gc.html#gc.DEBUG_SAVEALL), то все недостижимые объекты будут добавлены в этот список, а не освобождены.107108Следующие константы предоставляются для использования с [`set_debug()`](https://python-all.ru/2.7/library/gc.html#gc.set_debug):109110#### `gc.DEBUG_STATS`111112Вывод статистики во время сборки. Эта информация может быть полезна при настройке частоты сборки.113114#### `gc.DEBUG_COLLECTABLE`115116Вывод информации о найденных собираемых объектах.117118#### `gc.DEBUG_UNCOLLECTABLE`119120Выводит информацию о найденных несобираемых объектах (объектах, которые недостижимы, но не могут быть освобождены сборщиком). Эти объекты будут добавлены в список `garbage`.121122#### `gc.DEBUG_INSTANCES`123124Когда установлен [`DEBUG_COLLECTABLE`](https://python-all.ru/2.7/library/gc.html#gc.DEBUG_COLLECTABLE) или [`DEBUG_UNCOLLECTABLE`](https://python-all.ru/2.7/library/gc.html#gc.DEBUG_UNCOLLECTABLE), выводит информацию о найденных объектах-экземплярах.125126#### `gc.DEBUG_OBJECTS`127128Когда установлен [`DEBUG_COLLECTABLE`](https://python-all.ru/2.7/library/gc.html#gc.DEBUG_COLLECTABLE) или [`DEBUG_UNCOLLECTABLE`](https://python-all.ru/2.7/library/gc.html#gc.DEBUG_UNCOLLECTABLE), выводит информацию о найденных объектах, не являющихся экземплярами.129130#### `gc.DEBUG_SAVEALL`131132Если установлен, все найденные недостижимые объекты будут добавляться в *garbage*, а не освобождаться. Это может быть полезно для отладки программы с утечками.133134#### `gc.DEBUG_LEAK`135136Флаги отладки, необходимые для вывода сборщиком информации о программе с утечками (равно `DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE | DEBUG_INSTANCES | DEBUG_OBJECTS | DEBUG_SAVEALL`).137138Сноски139140**[1](https://python-all.ru/2.7/library/gc.html#id1)**141142До Python 2.2 список содержал все объекты-экземпляры в недостижимых циклах, а не только те, что имеют методы [`__del__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__del__).143