Почему Python использует и подсчет ссылок, и разметку и разметку для gc? - PullRequest
19 голосов
/ 30 января 2012

Мой вопрос: почему Python использует и подсчет ссылок, и метку-и-уборку для gc? Почему не только разметка?

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

Есть мысли?

Большое спасибо.

Ответы [ 3 ]

18 голосов
/ 30 января 2012

Python (язык) не говорит, какую форму сборки мусора он использует.Основная реализация (часто называемая CPython) действует так, как вы описали.Другие версии, такие как Jython или IronPython, используют систему сбора мусора.

Да, есть преимущество более раннего сбора с подсчетом ссылок, но основная причина, по которой CPython использует это, является исторической.Первоначально не было сборки мусора для циклических объектов, поэтому циклы приводили к утечкам памяти.API C и структуры данных в значительной степени основаны на принципе подсчета ссылок.Когда была добавлена ​​настоящая сборка мусора, невозможно было сломать существующие двоичные API и все библиотеки, которые зависели от них, поэтому счетчик ссылок должен был остаться.

14 голосов
/ 30 января 2012

Подсчет ссылок освобождает объекты раньше, чем сборщик мусора.

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

1 голос
/ 25 апреля 2013

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

Да. Как только refcount обнуляется и объект может быть удален. Это не произойдет в объекте с циклической ссылкой. AFAIK, маркировка и развертка - это дорогостоящая операция, и самый простой способ ее реализации требует от вас «остановить мир», пока объекты помечены. Когда все объекты пройдены, любой объект, не отмеченный (как достижимый), освобождается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...