Что делает CPYHON, чтобы помочь определить объектные циклы (подсчет ссылки)?
-
05-10-2019 - |
Вопрос
Из того, что я прочитал о CPYthon, похоже, что это имеет значение ссылки + что-то дополнительно для обнаружения / свободных объектов, указывающих друг на друга. (Исправьте меня, если я ошибаюсь). Может кто-то объяснить что-то дополнительное? Также эта гарантия * без цикла утечки? Если нет, есть ли исследование в алгоритме, доказано, чтобы добавить к ссылке, чтобы сделать его никогда не утечкой *? Будет ли это просто управлять без ссылки, отсчитывая трассировку GC каждый так часто?
* Удаление ошибок и проблемы с модулями с использованием интерфейса внешнего функционала
Решение
Как объяснено в документации для gc.garbage
, нет никакой гарантии, что утечки не происходят; В частности, циклические объекты с __del__
Методы не собираются по умолчанию. Для таких объектов циклические ссылки должны быть разбиты вручную, чтобы включить дальнейшее GC.
От того, что я понимаю, просматривая Cpython Sourcecode, Переводчик содержит ссылки на все объекты под его контролем. «Дополнительный» сборщик мусора запускает алгоритм Mark-and-Show-Algorith через кучу, помнит для каждого объекта, если он достигается от «снаружи» и, если нет, удаляет его. (ГХ генерация, но это может быть явно запущено от gc
модуль с A. generation
аргумент.)
Единственный эффективный алгоритм, который я мог подумать о том, что удовлетворяет вашим критериям, действительно будет «полным» алгоритмом GC для подсчета ссылок GC, и это то, что, по-видимому, реализуется в Python. Я не эксперт по этим вопросам, хотя.