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, возвращаются только те объекты, отслеживаемые коллектором, которые относятся к этому поколению.

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

Вызывает auditing event gc.get_objects с аргументом generation.

gc.get_stats()

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

  • collections - количество раз, когда это поколение было собрано;

  • collected - общее количество объектов, собранных в данном поколении;

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

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

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

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

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

gc.get_count()

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

gc.get_threshold()

Возвращает текущие пороговые значения коллекции в виде кортежа (threshold0, threshold1, threshold2).

gc.get_referrers(*objs)

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

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

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

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

Вызывает auditing event gc.get_referrers с аргументом objs.

gc.get_referents(*objs)

Возвращает список объектов, на которые непосредственно ссылается любой из аргументов. Возвращаемые ссылки - это объекты, посещаемые методами C-уровня аргументов tp_traverse (если таковые имеются), и это могут быть не все объекты, к которым можно непосредственно обратиться. Методы tp_traverse поддерживаются только объектами, поддерживающими сборку мусора, и необходимы только для посещения объектов, которые могут быть вовлечены в цикл. Так, например, если целое число непосредственно достижимо из аргумента, этот целочисленный объект может появиться в списке результатов, а может и не появиться.

Вызывает auditing event gc.get_referents с аргументом objs.

gc.is_tracked(obj)

Возвращает True, если объект в настоящее время отслеживается сборщиком мусора, False в противном случае. Как правило, экземпляры атомарных типов не отслеживаются, а экземпляры неатомарных типов (контейнеры, определяемые пользователем объекты…) отслеживаются. Однако, некоторые специфические для типов оптимизации могут присутствовать для того, чтобы уменьшить отпечаток сборщика мусора на простых экземплярах (например, dicts, содержащих только атомарные ключи и значения):

>>> 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.is_finalized(obj)

Возвращает True, если данный объект был финализирован сборщиком мусора, False в противном случае.

>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True

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

gc.freeze()

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

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

gc.unfreeze()

Разморозьте объекты в постоянном поколении, поместите их обратно в самое старое поколение.

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

gc.get_freeze_count()

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

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

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

gc.garbage

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

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

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

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

gc.callbacks

Список обратных вызовов, которые будут вызываться сборщиком мусора до и после сборки. Обратные вызовы будут вызываться с двумя аргументами, phase и info.

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

«start»: Сборка мусора вот-вот начнется.

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

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

«поколение»: Самое старое собираемое поколение.

«собрано»: Когда фаза равна «stop», количество успешно собранных объектов.

«uncollectable»: Когда фаза равна «stop», количество объектов, которые не могли быть собраны и были помещены в garbage.

Приложения могут добавлять свои собственные обратные вызовы в этот список. Основными вариантами использования являются:

Сбор статистики о сборке мусора, например, как часто происходит сбор различных поколений и сколько времени занимает сбор.

Позволяет приложениям определять и очищать свои собственные не собираемые типы, когда они появляются в garbage.

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

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

gc.DEBUG_STATS

Печать статистики во время сбора. Эта информация может быть полезна при настройке частоты сбора.

gc.DEBUG_COLLECTABLE

Распечатайте информацию о найденных коллекционных предметах.

gc.DEBUG_UNCOLLECTABLE

Выведите информацию о найденных неколлектируемых объектах (объекты, которые недоступны, но не могут быть освобождены коллектором). Эти объекты будут добавлены в список garbage.

Изменено в версии 3.2: Также выведите содержимое списка garbage в interpreter shutdown, если он не пуст.

gc.DEBUG_SAVEALL

Если установлено, все найденные недостижимые объекты будут добавлены в garbage, а не освобождены. Это может быть полезно для отладки негерметичной программы.

gc.DEBUG_LEAK

Флаги отладки, необходимые сборщику для печати информации об утечке программы (равны DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE | DEBUG_SAVEALL).

Вернуться на верх