Как объяснено в документации для gc.garbage
, нет никакой гарантии, что утечки не произойдет; в частности, циклические объекты с методами __del__
не собираются по умолчанию. Для таких объектов циклические ссылки должны быть разорваны вручную, чтобы включить дальнейший сбор данных.
Насколько я понимаю, просматривая исходный код CPython , интерпретатор сохраняет ссылки на все объекты, находящиеся под его контролем. «Дополнительный» сборщик мусора запускает алгоритм, похожий на метку и разметку, в куче, запоминает для каждого объекта, доступен ли он «извне», и, если нет, удаляет его. (GC является поколенческим , но его можно явно запустить из модуля gc
с аргументом generation
.)
Единственный эффективный алгоритм, который я мог бы придумать, который удовлетворял бы вашим критериям, действительно был бы "полным" алгоритмом GC для увеличения числа ссылок, и это то, что, кажется, реализовано в Python. Хотя я не эксперт в этих вопросах.