Когда объекты собирают мусор в python? - PullRequest
16 голосов
/ 26 февраля 2012

Когда объекты собирают мусор в python? Когда освобождается память и влияет ли сбор на производительность? Можно ли отключить или настроить алгоритм gc, и если да, то как?

Ответы [ 2 ]

12 голосов
/ 26 февраля 2012

Когда в Python собирается мусор объектов?

В исходном коде CPython есть много деталей: http://svn.python.org/view/python/trunk/Modules/gcmodule.c?revision=81029&view=markup

В любое время подсчет ссылокпадает до нуля, объект немедленно удаляется.

293 / * Циклический gc Python никогда не должен видеть входящий refcount

294 * из 0: если что-то уменьшилось до 0,в это время он должен был быть

295 * немедленно освобожден.

Полная коллекция запускается, когда количество новых объектов превышает 25% от числа существующих объектов.

87 В дополнение к различным настраиваемым порогам мы запускаем полный сбор

88, только если соотношение

89 long_lived_pending / long_lived_total

90 выше заданного значения (до 25%).

Когда освобождается память?

Мне удалось только получить эту информацию.

781 / * Очистить все бесплатные списки

782 * Все свободные списки очищаются при сборе самого высокого поколения.

783 * Выделенные элементы в свободномlist может держать арену pymalloc занятой.

784 * Очистка свободных списков может вернуть память операционной системе раньше.

785 * /

В соответствии с этимВозможно, Python хранит ваш объект в свободном списке для повторного использования, даже если вы сбросите его refcount до нуля.Я не могу точно определить, когда делается бесплатный вызов, чтобы вернуть память операционной системе, но я представляю, что это делается всякий раз, когда создается коллекция, и объект не сохраняется в свободном списке.

Влияет ли сбор на производительность?

Любой нетривиальный сборщик мусора, о котором я слышал, требует для работы и процессора, и памяти.Поэтому да, всегда есть влияние на производительность.Вам придется поэкспериментировать и познакомиться со своим сборщиком мусора.

Программы, требующие оперативного реагирования в реальном времени, с которыми у меня возникли проблемы, поскольку сборщики мусора не предоставляют мне контроль над тем, когда они работают или как долгоони делают.Некоторые специфические случаи могут также вызвать чрезмерное использование памяти, например, умение Python хранить свободные списки.

12 голосов
/ 26 февраля 2012

Вот выдержка из справочника

Объекты никогда не уничтожаются явно; однако, когда они становятся недоступными, они могут быть собраны мусором. Реализации разрешено откладывать сборку мусора или вообще ее пропускать - вопрос качества реализации заключается в том, как осуществляется сборка мусора, если не собраны объекты, которые все еще достижимы.

Подробности реализации CPython : CPython в настоящее время использует схему подсчета ссылок с (необязательным) отложенным обнаружением циклически связанного мусора, который собирает большинство объектов, как только они становятся недоступными, но не гарантирует, что сбор мусора содержащие циркулярные ссылки. См. Документацию модуля gc для получения информации об управлении сборкой циклического мусора. Другие реализации действуют иначе, и CPython может измениться. Не полагайтесь на немедленное завершение объектов, когда они становятся недоступными (например, всегда закрывайте файлы).

РЕДАКТИРОВАТЬ: О переносе сбора мусора .... модуль gc позволяет вам взаимодействовать с сборщиком мусора и отключать его, если вы хотите, и изменять частоту сбора мусора и т. Д. Но у меня нет использовал это сам. Кроме того, циклы, содержащие любые объекты с __del__ методами , не собираются .

...