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=2)

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

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

gc.set_debug(flags)

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

gc.get_debug()

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

gc.get_objects(generation=None)

Возвращает список всех объектов, отслеживаемых коллектором, за исключением возвращенного списка. Если generation не является None, возвращает only объекты, отслеживаемые коллектором, которые находятся в этом поколении.

Изменено в версии 3.8: Новый параметр generation.

gc.get_stats()

Список возвращает трех словарей за поколение, содержащих статистику коллекции начиная с интерпретатор, начинается. Количество ключей может измениться в будущем, но в настоящее время каждый словарь будет содержать следующие элементы:

  • collections - количество раз, когда это поколение собиралось;
  • collected - общее количество объектов, собранных внутри этого поколения;
  • uncollectable - общее число объектов, которые были признаны несборными (и поэтому были перемещены в список garbage) в этом поколении.

Добавлено в версии 3.4.

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

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

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

gc.get_count()

Возвращает текущая коллекция считается кортежем (count0, count1, count2).

gc.get_threshold()

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

gc.get_referrers(*objs)

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

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

Предупреждение

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

gc.get_referents(*objs)

Возвращает список объектов, на которые непосредственно ссылается любой из аргументов. возвращенныйare референтов те объекты, которые посещают методы аргументов уровня-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.freeze()

Заморозить все объекты, отслеживаемые gc - переместить их в постоянное поколение и игнорировать все будущие коллекции. Это может быть используемый, прежде чем вилка POSIX () будет звонить, чтобы сделать GC copy-write дружелюбным или ускорить коллекцию. Также сбор перед вызовом POSIX fork () может освободить страницы для будущего выделения, что может вызвать копирование при записи, поэтому рекомендуется отключить gc в родительском процессе и заморозить перед вилкой и включить gc в дочернем процессе.

Добавлено в версии 3.7.

gc.unfreeze()

Размораживайте объекты в постоянном поколении, возвращайте их в древнейшее поколение.

Добавлено в версии 3.7.

gc.get_freeze_count()

Возвращает количество объектов в постоянной генерации.

Добавлено в версии 3.7.

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

gc.garbage

Список объектов, к которым коллектор обнаружил недоступные, но которые не удалось освободить (необъективные объекты). Начиная с Python 3.4, этот список должен быть пуст большую часть времени, за исключением случаев, когда используется сущности типов внутренних линий C с слотом не NULL tp_del.

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

Изменено в версии 3.2: Если этот список непуст при выключении интерпретатора, ResourceWarning испускается, который тих по умолчанию. Если задано значение DEBUG_UNCOLLECTABLE, кроме того, печатаются все необъедаемые объекты.

Изменено в версии 3.4: См. PEP 442, объекты с методом __del__() больше не заканчиваются gc.garbage.

gc.callbacks

Список колбэков, который будет призван сборщиком мусора прежде и после коллекции. Вызов колбэков будет осуществляться с двумя аргументами: phase и info.

phase может быть одним из двух значения:

«start»: выполняется запуск сборки мусора.

«stop»: сборка мусора завершена.

info является словарь, предоставляющим дополнительную информацию для колбэк. В настоящее время определены следующие ключи:

«Поколение» - самое старое из собранных поколений.

«собранный»: когда phase - «остановка», количество объектов, успешно собранных.

«безнадежный в отношении оплаты»: когда phase - «остановка», количество объектов, которые не могли быть собраны и были помещены в 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).