gc — Интерфейс сборщика мусора
Этот модуль предоставляет интерфейс к необязательному сборщику мусора. Он позволяет отключить сборщик, настроить частоту сбора и установить параметры отладки. Он также предоставляет доступ к недостижимым объектам, которые сборщик обнаружил, но не может освободить. Поскольку сборщик дополняет механизм подсчёта ссылок, уже используемый в Python, вы можете отключить сборщик, если уверены, что ваша программа не создаёт циклические ссылки. Автоматический сбор можно отключить, вызвав gc.disable(). Для отладки программы с утечками вызовите gc.set_debug(gc.DEBUG_LEAK). Обратите внимание, что это включает gc.DEBUG_SAVEALL, что заставляет объекты, подлежащие сборке мусора, сохраняться в gc.garbage для проверки.
Модуль gc предоставляет следующие функции:
-
gc.enable() -
Включить автоматический сбор мусора.
-
gc.disable() -
Отключить автоматический сбор мусора.
-
gc.isenabled() -
Возвращает true, если автоматический сбор включён.
-
gc.collect([generation]) -
Без аргументов выполняет полный сбор. Необязательный аргумент generation может быть целым числом, указывающим, какую генерацию собирать (от 0 до 2). Если номер генерации некорректен, поднимается исключение
ValueError. Возвращается количество найденных недостижимых объектов.Изменено в версии 2.5: Добавлен необязательный аргумент generation.
Изменено в версии 2.6: Списки свободных объектов, поддерживаемые для ряда встроенных типов, очищаются всякий раз, когда выполняется полный сбор или сбор старшей генерации (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. Эта функция будет находить только те контейнеры, которые поддерживают сбор мусора; типы расширений, которые ссылаются на другие объекты, но не поддерживают сбор мусора, не будут найдены.
Обратите внимание, что объекты, которые уже были дессыланы, но существуют в циклах и ещё не были собраны сборщиком мусора, могут быть перечислены среди результативных referrers. Чтобы получить только текущие живые объекты, вызовите
collect()перед вызовомget_referrers().Необходимо соблюдать осторожность при использовании объектов, возвращаемых
get_referrers(), потому что некоторые из них могут ещё создаваться и, следовательно, находиться в временно недопустимом состоянии. Избегайте использованияget_referrers()для целей, отличных от отладки.Введено в версии 2.2.
-
gc.get_referents(*objs) -
Возвращает список объектов, напрямую ссылающихся на любые из аргументов. Возвращаемые referents — это те объекты, которые посещаются методами аргументов 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 не собирает такие циклы автоматически, так как, вообще говоря, 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__().
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/2.7/library/gc.html