Как сборщик мусора Python обнаруживает циклические ссылки?

Я пытаюсь понять, как сборщик мусора Python обнаруживает циклические ссылки. Когда я смотрю на документацию, все, что я вижу, это утверждение, что циклические ссылки обнаружены, за исключением случаев, когда соответствующие объекты имеют __del__ метод.

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

Как обнаруживает Python & свободные циклические ссылки на память перед использованием модуля gc?

3 ответов


как Python обнаруживает & свободные циклические ссылки памяти перед использованием модуля gc?

это не так. Gc существует только to обнаружение и бесплатные циклические ссылки. Некруглые ссылки обрабатываются путем пересчета.

теперь, чтобы увидеть как gc определяет набор объектов, на которые ссылается любой данный объект, взгляните на


Я думаю, что нашел ответ, который я ищу в некоторых ссылках, предоставленных @SvenMarnich в комментариях к исходному вопросу:

объекты контейнера-это объекты Python, которые могут содержать ссылки на другие объекты Python. Списки, классы, кортежи и т. д.-Это объекты-контейнеры; целые числа, строки и т. д. не. Таким образом, только контейнерные объекты подвергаются риску быть в круговой ссылке.

каждый объект Python имеет поле- * gc_ref*, которое (я считаю) имеет значение NULL для неконтейнерные объекты. Для контейнерных объектов он устанавливается равным числу не контейнерные объекты что ссылка это

любой объект контейнера с * gc_ref * count больше 1 (? Я бы подумал 0, но пока все в порядке ?) имеет ссылки, которые не являются объектами контейнера. Таким образом, они достижимы и удалены из рассмотрения как недостижимые острова памяти.

любой объект контейнера, достижимый объектом, известным как достижимый (т. е. те, которые мы просто признано, что количество * gc_ref * больше 1) также не нужно освобождать.

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

http://www.arctrix.com/nas/python/gc/ Ссылка обеспечивая более полное объяснение http://hg.python.org/cpython/file/2059910e7d76/Modules/gcmodule.c является ссылкой на исходный код, в котором есть комментарии, объясняющие мысли, стоящие за циркуляром обнаружение ссылок


как Python обнаруживает & свободные циклические ссылки памяти перед использованием модуля gc?

сборщик мусора Python (на самом деле не gc модуль, который является только интерфейсом Python для сборщика мусора) делает это. Так, В Python не обнаружение и свободные циклические ссылки памяти перед использованием сборщика мусора.

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

это все специфично для CPython, конечно. Другие реализации Python имеют другое управление памятью (Jython = Java VM, IronPython = Microsoft .NET CLR).