Когда мусор CPython собирает?

Если я правильно понимаю, в CPython объекты будут удалены, как только их число ссылок достигнет нуля. Если у вас есть циклы ссылок, которые становятся недоступными, то логика не будет работать, но иногда интерпретатор попытается найти их и удалить их (и вы можете сделать это вручную, вызвав gc.collect()).

Мой вопрос: когда происходят эти этапы сбора цикла, запускаемые интерпретатором? Какие события вызывают их?

Меня больше интересует случай с CPython, но хотелось бы услышать, как это отличается в PyPy или других реализациях Python.

1 ответ

Решение

GC периодически запускается на основе (разности) числа распределений и освобождений, которые имели место с момента последнего запуска GC.

Увидеть gc.set_threshold() функция:

Чтобы решить, когда запускать, сборщик следит за распределением и освобождением числовых объектов с момента последней коллекции. Когда количество выделений минус количество освобождений превышает порог 0, сбор начинается.

Вы можете получить доступ к текущим счетам с gc.get_count(); это возвращает кортеж из трёх дорожек GC отсчетов (остальные 2 должны определить, когда следует выполнять более глубокое сканирование).

Сборщик мусора PyPy работает совершенно по-другому, поскольку процесс GC в PyPy отвечает завсе освобождения, а не только за циклические ссылки. Более того, сборщик мусора PyPy является подключаемым, а это означает, что частота его работы зависит от того, какой вариант GC вы выбрали. Например, стратегия Minimark по умолчанию даже не запускается, если она ниже порога памяти.

См. Документацию по сборщику мусора RPython для получения подробной информации об их стратегиях и опциях конфигурации Minimark, чтобы получить дополнительные советы по настройке.

То же самое для Jython или IronPython; эти реализации полагаются на среду выполнения хоста (Java и.NET) для обработки сборки мусора для них.

Другие вопросы по тегам