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

27.10. 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(generations=2)

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

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

gc.set_debug(flags)
Устанавливает флаги отладки сборки мусора. Отладочная информация будет записываться в sys.stderr. См. ниже список флагов отладки, которые можно комбинировать с помощью побитовых операций для управления отладкой.
gc.get_debug()
Возвращает текущие установленные флаги отладки.
gc.get_objects()
Возвращает список всех объектов, отслеживаемых сборщиком, за исключением возвращаемого списка.
gc.set_threshold(threshold0[, threshold1[, threshold2]])

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

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

gc.get_count()
Возвращает текущие счётчики сборки в виде кортежа (count0, count1, count2).
gc.get_threshold()
Возвращает текущие пороги сборки в виде кортежа (threshold0, threshold1, threshold2).
gc.get_referrers(*objs)

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

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

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

gc.get_referents(*objs)
Возвращает список объектов, на которые непосредственно ссылается любой из аргументов. Возвращаемые референты – это объекты, посещаемые C-уровневым методом tp_traverse аргументов (если он есть), и могут не включать все объекты, фактически достижимые напрямую. Методы tp_traverse поддерживаются только объектами, которые поддерживают сборку мусора, и требуются только для посещения объектов, которые могут быть вовлечены в цикл. Так, например, если целое число напрямую достижимо из аргумента, этот объект целого числа может как появиться, так и не появиться в результирующем списке.
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

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

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

gc.garbage

Список объектов, которые сборщик счёл недостижимыми, но не смог освободить (несобираемые объекты). По умолчанию этот список содержит только объекты с методами __del__(). Объекты, имеющие методы __del__() и входящие в циклическую ссылку, делают всю циклическую ссылку несобираемой, включая объекты, не обязательно находящиеся в цикле, но достижимые только из него. Python не собирает такие циклы автоматически, потому что, вообще говоря, 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_SAVEALL
Если установлен, все найденные недостижимые объекты будут добавляться в garbage, а не освобождаться. Это может быть полезно для отладки программы с утечками.
gc.DEBUG_LEAK
Флаги отладки, необходимые сборщику для вывода информации об утекающей программе (равны DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE | DEBUG_SAVEALL).