Подтвердить что ты не робот

Почему python использует как подсчет ссылок, так и mark-and-sweep для gc?

Мой вопрос в том, почему python использует как подсчет ссылок, так и mark-and-sweep для gc? Почему не только пометка и прокрутка?

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

Любые мысли?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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