Ответ 1
Любой полупристойный сборщик мусора будет обрабатывать циклы.
Циклы - это только проблема, если вы делаете наивный подсчет ссылок.
Большинство сборщиков мусора не выполняют ref-counting (как потому, что не могут обрабатывать циклы, а потому, что они неэффективны). Вместо этого они просто следуют каждой ссылке, которую они могут найти, начиная с "корней" (обычно глобальных переменных и переменных на основе стека) и отмечают все, что они могут найти как "достижимые".
Затем они просто восстанавливают всю другую память.
Циклы не проблема, потому что они просто означают, что один и тот же node будет достигнут несколько раз. После первого раза node будет отмечен как "достижимый", и поэтому GC узнает, что он уже существует, и пропустите node.
Еще более примитивный GC на основе подсчета ссылок обычно реализует алгоритмы для обнаружения и прерывания циклов.
Короче говоря, это не то, о чем вам нужно беспокоиться. Я, кажется, помню, что IE6 Javascript GC фактически не справлялся с циклами (я мог ошибаться, прошло некоторое время с тех пор, как я его прочитал, и это было намного больше, так как я коснулся IE6), но в любой современной реализации это не проблема.
Весь сборщик мусора - это абстрагирование управления памятью. Если вам нужно выполнить эту работу самостоятельно, ваш GC сломан.
См. MDN для получения дополнительной информации о современной сборке мусора и используемых алгоритмах маркировки и развертки.