"не обнаруживает циклические структуры"
Допустим, у меня есть объект A
. A
нужен другой объект с именем B
, чтобы выполнить свою работу. Но B
нужен другой объект с именем C
, чтобы выполнить свою работу. Но C
по той или иной причине нужен указатель на A
. Таким образом, график зависимости выглядит так:
A -> B -> C -> A
Счетчик ссылок для объекта должен быть числом стрелок, указывающих на него. В этом примере каждый объект имеет счетчик ссылок, равный единице.
Допустим, наша основная программа создала такую структуру во время своего выполнения, и основная программа имела указатель на A
, в результате чего счет A
был равен двум. Что происходит, когда эта структура выходит за рамки? Счетчик ссылок A
уменьшен до единицы.
Но обратите внимание! Теперь A
, B
и C
имеют количество ссылок, равное единице, хотя они недоступны из основной программы . Так что это утечка памяти. В Википедии есть деталей о том, как решить эту проблему.
«он может постепенно восстанавливать пространство»
У большинства сборщиков мусора есть период сбора, в течение которого они приостанавливают выполнение и освобождают объекты, которые больше не используются. В системе разметки это шаг развертки. Недостатком является то, что в периоды между циклами память продолжает расти и расти. Объект может перестать использоваться почти сразу после его создания, но он никогда не будет возвращен до следующего цикла.
В системе подсчета ссылок объекты освобождаются, как только их счетчик ссылок достигает нуля. Здесь нет большой паузы или большого шага развертки, и объекты, которые больше не используются, не просто сидят в ожидании сбора, они немедленно освобождаются. Следовательно, коллекция является инкрементной в том смысле, что она постепенно собирает любой объект, который больше не используется, а не собирает все объекты, которые перестали использоваться со времени последней коллекции.
Конечно, этот инкрементализм может иметь свои собственные подводные камни, а именно то, что может быть дешевле сделать массовый сборщик мусора, чем множество мелких, но это определяется точной реализацией.