Документация Python неофициальный перевод

28.12. gc – Интерфейс сборщика мусораgc – Garbage Collector interface

Этот модуль предоставляет интерфейс к необязательному сборщику мусора. Он позволяет отключить сборщик, настроить частоту сборки и установить параметры отладки. Также он предоставляет доступ к недостижимым объектам, которые сборщик нашел, но не может освободить. Поскольку сборщик дополняет подсчёт ссылок, уже используемый в Python, его можно отключить, если программа не создаёт циклических ссылок. Автоматическую сборку можно отключить вызовом gc.disable(). Для отладки утекающей программы вызовите gc.set_debug(gc.DEBUG_LEAK). Обратите внимание, что это включает gc.DEBUG_SAVEALL, что приводит к сохранению собранных объектов в gc.garbage для проверки.

Модуль gc предоставляет следующие функции:

gc.enable()

Включить автоматическую сборку мусора.

gc.disable()

Отключить автоматическую сборку мусора.

gc.isenabled()

Возвращает истину, если автоматическая сборка включена.

gc.collect([generation])

Без аргументов выполняет полную сборку. Необязательный аргумент поколение может быть целым числом, указывающим, какое поколение собирать (от 0 до 2). Если номер поколения неверен, вызывается исключение ValueError. Возвращается количество найденных недостижимых объектов.

Изменено в версии 2.5: Добавлен необязательный аргумент generation.

Изменено в версии 2.6: Списки свободной памяти (free lists), поддерживаемые для ряда встроенных типов, очищаются при каждом полном сборе или сборе самого старшего поколения (2). Не все элементы в некоторых списках свободной памяти могут быть освобождены из-за особенностей реализации, в частности int и float.

gc.set_debug(flags)

Устанавливает флаги отладки сборщика мусора. Отладочная информация будет записываться в sys.stderr. См. ниже список флагов отладки, которые можно комбинировать с помощью битовых операций для управления отладкой.

gc.get_debug()

Возвращает текущие установленные флаги отладки.

gc.get_objects()

Возвращает список всех объектов, отслеживаемых сборщиком, за исключением возвращаемого списка.

Новое в версии 2.2.

gc.set_threshold(threshold0[, threshold1[, threshold2]])

Устанавливает пороги сборки мусора (частоту сборки). Установка threshold0 в ноль отключает сборку.

Сборщик мусора классифицирует объекты по трём поколениям в зависимости от того, сколько циклов сборки они пережили. Новые объекты помещаются в самое молодое поколение (поколение 0). Если объект переживает сборку, он перемещается в следующее более старое поколение. Поскольку поколение 2 является самым старым, объекты в этом поколении остаются там после сборки. Чтобы решить, когда запускаться, сборщик отслеживает количество выделений и освобождений объектов с момента последней сборки. Когда количество выделений минус количество освобождений превышает threshold0, начинается сборка. Изначально проверяется только поколение 0. Если поколение 0 проверялось более threshold1 раз с тех пор, как проверялось поколение 1, то также проверяется поколение 1. Аналогично, threshold2 управляет количеством сборок поколения 1 перед сборкой поколения 2.

gc.get_count()

Возвращает текущие счётчики сборок в виде кортежа из (count0, count1, count2).

Новое в версии 2.5.

gc.get_threshold()

Возвращает текущие пороговые значения сборок в виде кортежа из (threshold0, threshold1, threshold2).

gc.get_referrers(*objs)

Возвращает список объектов, которые напрямую ссылаются на любой из objs. Эта функция находит только те контейнеры, которые поддерживают сборку мусора; типы расширений, которые ссылаются на другие объекты, но не поддерживают сборку мусора, найдены не будут.

Обратите внимание, что объекты, на которые уже нет ссылок, но которые находятся в циклах и ещё не собраны сборщиком мусора, могут оказаться среди возвращаемых ссылающихся объектов. Чтобы получить только живые объекты, вызовите collect() перед вызовом get_referrers().

Следует соблюдать осторожность при использовании объектов, возвращаемых get_referrers(), поскольку некоторые из них могут всё ещё находиться в процессе конструирования и, следовательно, во временно недопустимом состоянии. Избегайте использования get_referrers() для каких-либо целей, кроме отладки.

Новое в версии 2.2.

gc.get_referents(*objs)

Возвращает список объектов, на которые напрямую ссылается любой из аргументов. Возвращаемые референты – это объекты, посещённые C-уровневыми методами tp_traverse аргументов (если они есть), и это могут быть не все объекты, действительно достижимые напрямую. Методы tp_traverse поддерживаются только объектами, которые поддерживают сборку мусора, и от них требуется только посещение объектов, которые могут участвовать в циклах. Так, например, если целое число напрямую достижимо из аргумента, этот целочисленный объект может как появиться в результирующем списке, так и нет.

Новое в версии 2.3.

gc.is_tracked(obj)

Возвращает True, если объект в настоящее время отслеживается сборщиком мусора, и False в противном случае. Как правило, экземпляры атомарных типов не отслеживаются, а экземпляры неатомарных типов (контейнеры, пользовательские объекты и т.д.) отслеживаются. Однако могут присутствовать некоторые оптимизации для конкретных типов, чтобы уменьшить влияние на сборщик мусора простых экземпляров (например, словарей, содержащих только атомарные ключи и значения):

>>> gc.is_tracked(0)
False
>>> gc.is_tracked("a")
False
>>> gc.is_tracked([])
True
>>> gc.is_tracked({})
False
>>> gc.is_tracked({"a": 1})
False
>>> gc.is_tracked({"a": []})
True

Новое в версии 2.7.

Следующая переменная предоставляется для доступа только для чтения (можно изменять её значение, но не следует переназначать её):

gc.garbage

Список объектов, которые сборщик счёл недостижимыми, но не смог освободить (несобираемые объекты). По умолчанию этот список содержит только объекты с методами __del__(). 1 Объекты, имеющие методы __del__() и являющиеся частью цикла ссылок, делают весь цикл ссылок несобираемым, включая объекты, не обязательно находящиеся в этом цикле, но достижимые только из него. Python не собирает такие циклы автоматически, потому что, как правило, невозможно угадать безопасный порядок выполнения методов __del__(). Если вам известен безопасный порядок, можно принудительно решить проблему, изучив список garbage и явно разорвав циклы, образованные вашими объектами в этом списке. Обратите внимание, что эти объекты всё равно остаются живыми из-за нахождения в списке garbage, поэтому их следует также удалить из garbage. Например, после разрыва циклов выполните del gc.garbage[:], чтобы очистить список. Вообще говоря, лучше избегать этой проблемы, не создавая циклы, содержащие объекты с методами __del__(); в этом случае можно проверить garbage, чтобы убедиться, что такие циклы не создаются.

Если установлен DEBUG_SAVEALL, то все недостижимые объекты будут добавлены в этот список, а не освобождены.

Следующие константы предоставляются для использования с set_debug():

gc.DEBUG_STATS

Вывод статистики во время сборки. Эта информация может быть полезна при настройке частоты сборки.

gc.DEBUG_COLLECTABLE

Вывод информации о найденных собираемых объектах.

gc.DEBUG_UNCOLLECTABLE

Выводит информацию о найденных несобираемых объектах (объектах, которые недостижимы, но не могут быть освобождены сборщиком). Эти объекты будут добавлены в список garbage.

gc.DEBUG_INSTANCES

Когда установлен DEBUG_COLLECTABLE или DEBUG_UNCOLLECTABLE, выводит информацию о найденных объектах-экземплярах.

gc.DEBUG_OBJECTS

Когда установлен DEBUG_COLLECTABLE или DEBUG_UNCOLLECTABLE, выводит информацию о найденных объектах, не являющихся экземплярами.

gc.DEBUG_SAVEALL

Если установлен, все найденные недостижимые объекты будут добавляться в garbage, а не освобождаться. Это может быть полезно для отладки программы с утечками.

gc.DEBUG_LEAK

Флаги отладки, необходимые для вывода сборщиком информации о программе с утечками (равно DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE | DEBUG_INSTANCES | DEBUG_OBJECTS | DEBUG_SAVEALL).

Сноски

1

До Python 2.2 список содержал все объекты-экземпляры в недостижимых циклах, а не только те, что имеют методы __del__().