Когда объекты мусора собираются в python? Когда освобождается память и влияет ли производительность на сбор? Можно ли отказаться или настроить алгоритм gc, и если да, то как?
Когда объекты мусора собираются в python?
Ответ 1
Вот выдержка из ссылка на язык
Объекты никогда не уничтожаются явно; однако, когда они становятся недостижимыми, они могут быть собраны в мусор. Реализация позволяет отложить сборку мусора или вообще опустить ее. Реализация качества сборки мусора - это вопрос качества реализации, пока не собраны никакие объекты, которые еще доступны.
Детализация CPython. В настоящее время CPython использует схему подсчета ссылок с (опционально) задержкой обнаружения циклически связанного мусора, который собирает большинство объектов, как только они становятся недоступными, но не гарантируется сбор мусор, содержащий круглые ссылки. Информацию об управлении сбором циклического мусора см. В документации модуля gc. Другие реализации действуют по-разному, и CPython может измениться. Не зависеть от немедленной финализации объектов, когда они становятся недоступными (например: всегда закрывать файлы).
EDIT: об отсрочке сбора мусора.... gc
модуль позволяет вам взаимодействовать с сборщиком мусора и отключать его если вы хотите изменить частоту сбора и т.д. Но я не использовал его сам. Кроме того, циклы, содержащие любые объекты с методами __del__
не собираются.
Ответ 2
Когда объекты мусора собираются в python?
В исходном коде для CPython много деталей: http://svn.python.org/view/python/trunk/Modules/gcmodule.c?revision=81029&view=markup
Каждый раз, когда количество ссылок уменьшается до нуля, объект немедленно удаляется.
293/* Python циклический gc никогда не должен видеть входящий refcount
294 * of 0: если что-то уменьшилось до 0, оно должно было быть
295 * освобождается сразу же в это время.
Полная коллекция запускается, когда число новых объектов превышает 25% от числа существующих объектов.
87 В дополнение к различным настраиваемым пороговым значениям мы вызываем только
88 полная коллекция, если отношение
89 long_lived_pending/long_lived_total
90 выше заданного значения (до 25%).
Когда выпущена память?
Я мог только выловить эту информацию.
781/* Удалить все бесплатные списки
782 * Все бесплатные списки удаляются во время сбора самого высокого поколения.
783 * Выделенные предметы в свободном списке могут содержать арену pymalloc занятыми.
784 * Удаление бесплатных списков может вернуть память ранее.
785 */
В соответствии с этим Python может хранить ваш объект в свободном списке для повторной переработки, даже если вы откажете его refcount в ноль. Я не могу явно найти, когда делается бесплатный вызов, чтобы вернуть память в операционную систему, но я полагаю, что это делается всякий раз, когда создается коллекция, и объект не хранится в свободном списке.
Эффект влияет на производительность коллекции?
Любой нетривиальный сборщик мусора, о котором я слышал, требует работы как процессора, так и памяти. Поэтому да, всегда есть влияние на производительность. Вам придется поэкспериментировать и познакомиться с вашим сборщиком мусора.
Программы, требующие оперативного реагирования в реальном времени. Я столкнулся с проблемами, поскольку сборщики мусора не дают мне контроля над тем, когда они запускаются или как долго они работают. Некоторые специфические случаи могут вызвать чрезмерное использование памяти, примером может быть умение Python для хранения свободных списков.