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).
Сноски