Когда в 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 хранить свободные списки.