Что делает cpython, чтобы помочь обнаружить циклы объектов (подсчет ссылок)? - PullRequest
3 голосов
/ 26 сентября 2010

Из того, что я читал о cpython, кажется, что он подсчитывает ссылки + что-то дополнительное для обнаружения / освобождения объектов, указывающих друг на друга (исправьте меня, если я ошибаюсь). Может ли кто-нибудь объяснить что-то лишнее? Также это гарантирует * отсутствие утечки цикла? Если нет, то есть ли какое-либо исследование алгоритма, добавленного в счетчик ссылок, чтобы он никогда не просочился *? Будет ли это просто запускать трассировку gc без подсчета ссылок?

* дисконтирование ошибок и проблем с модулями с использованием интерфейса сторонних функций

1 Ответ

4 голосов
/ 26 сентября 2010

Как объяснено в документации для gc.garbage, нет никакой гарантии, что утечки не произойдет; в частности, циклические объекты с методами __del__ не собираются по умолчанию. Для таких объектов циклические ссылки должны быть разорваны вручную, чтобы включить дальнейший сбор данных.

Насколько я понимаю, просматривая исходный код CPython , интерпретатор сохраняет ссылки на все объекты, находящиеся под его контролем. «Дополнительный» сборщик мусора запускает алгоритм, похожий на метку и разметку, в куче, запоминает для каждого объекта, доступен ли он «извне», и, если нет, удаляет его. (GC является поколенческим , но его можно явно запустить из модуля gc с аргументом generation.)

Единственный эффективный алгоритм, который я мог бы придумать, который удовлетворял бы вашим критериям, действительно был бы "полным" алгоритмом GC для увеличения числа ссылок, и это то, что, кажется, реализовано в Python. Хотя я не эксперт в этих вопросах.

...