29.11. 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=2)¶ Без аргументов выполняет полную сборку. Необязательный аргумент поколение может быть целым числом, указывающим, какое поколение собирать (от 0 до 2). Если номер поколения неверен, вызывается исключение
ValueError. Возвращается количество найденных недостижимых объектов.Списки свободной памяти, ведущиеся для ряда встроенных типов, очищаются при полной сборке или сборке самого старшего поколения (2). Не все элементы в некоторых списках свободной памяти могут быть освобождены из-за особенностей реализации, в частности
float.
-
gc.set_debug(flags)¶ Устанавливает флаги отладки сборщика мусора. Отладочная информация будет записываться в
sys.stderr. См. ниже список флагов отладки, которые можно комбинировать с помощью битовых операций для управления отладкой.
-
gc.get_debug()¶ Возвращает текущие установленные флаги отладки.
-
gc.get_objects()¶ Возвращает список всех объектов, отслеживаемых сборщиком, за исключением возвращаемого списка.
-
gc.get_stats()¶ Возвращает список из трёх словарей по поколениям, содержащих статистику сборки с момента запуска интерпретатора. Количество ключей может измениться в будущем, но в настоящее время каждый словарь содержит следующие элементы:
collections– количество сборок этого поколения;collected– общее количество объектов, собранных в этом поколении;uncollectable– общее количество объектов, признанных не подлежащими сборке (и поэтому перемещённых в списокgarbage) в этом поколении.
Новое в версии 3.4.
-
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¶ Список объектов, которые сборщик счёл недоступными, но не смог освободить (несобираемые объекты). Начиная с Python 3.4, этот список должен быть пуст большую часть времени, за исключением случаев использования экземпляров типов расширений C с ненулевым слотом
tp_del.Если
DEBUG_SAVEALLустановлено, то все недостижимые объекты будут добавлены в этот список, а не освобождены.Изменено в версии 3.2: Если этот список не пуст при завершении интерпретатора, выдается
ResourceWarning, который по умолчанию является молчаливым. ЕслиDEBUG_UNCOLLECTABLEустановлено, дополнительно выводятся все неподлежащие сборке объекты.Изменено в версии 3.4: В соответствии с PEP 442, объекты с методом
__del__()больше не попадают вgc.garbage.
-
gc.callbacks¶ Список колбэков, которые будут вызываться сборщиком мусора до и после сборки. Колбэки будут вызываться с двумя аргументами: phase и info.
phase может принимать одно из двух значений:
“start”: сборка мусора начинается.
“stop”: сборка мусора завершена.
info – это словарь, предоставляющий дополнительную информацию для колбэка. В настоящее время определены следующие ключи:
“generation”: самое старое поколение, участвующее в сборке.
“collected”: когда phase равен “stop”, количество успешно собранных объектов.
“uncollectable”: когда phase равен “stop”, количество объектов, которые не удалось собрать и которые были помещены в
garbage.Приложения могут добавлять свои собственные колбэки в этот список. Основные случаи использования:
Сбор статистики о сборке мусора, например, как часто собираются различные поколения и сколько времени занимает сборка.
Позволяет приложениям выявлять и очищать собственные несобираемые типы, когда они появляются в
garbage.Новое в версии 3.3.
Следующие константы предоставляются для использования с set_debug():
-
gc.DEBUG_STATS¶ Вывод статистики во время сборки. Эта информация может быть полезна при настройке частоты сборки.
-
gc.DEBUG_COLLECTABLE¶ Вывод информации о найденных собираемых объектах.
-
gc.DEBUG_UNCOLLECTABLE¶ Вывод информации о найденных несобираемых объектах (объекты, которые недостижимы, но не могут быть освобождены сборщиком). Эти объекты будут добавлены в список
garbage.Изменено в версии 3.2: Также выводить содержимое списка
garbageпри завершении интерпретатора, если он не пуст.
-
gc.DEBUG_SAVEALL¶ Если установлен, все найденные недостижимые объекты будут добавляться в garbage, а не освобождаться. Это может быть полезно для отладки программы с утечками.
-
gc.DEBUG_LEAK¶ Флаги отладки, необходимые для вывода сборщиком информации о программе с утечками (равно
DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE | DEBUG_SAVEALL).