Этот алгоритм сводит определение "объект больше не нужен" к определению "объект недоступен".
Этот алгоритм предполагает знание набора объектов, называемых корнями. В JavaScript корень - это глобальный объект. Периодически сборщик мусора будет начинать с этих корней, находить все объекты, на которые ссылаются эти корни, затем все объекты, на которые ссылаются эти корни, и т. д. Таким образом, начиная с корней, сборщик мусора найдет все достижимые объекты и соберет все недостижимые объекты.
Этот алгоритм является улучшением по сравнению с предыдущим, поскольку объект с нулевыми ссылками фактически недостижим. Обратное не верно, как мы видели в случае с круговыми ссылками.
В настоящее время все современные движки поставляют сборщик мусора с функцией mark-and-sweep. Все улучшения, сделанные в области сборки мусора JavaScript (generational/incremental/concurrent/parallel garbage collection) за последние несколько лет, являются улучшениями реализации этого алгоритма, но не улучшениями самого алгоритма сборки мусора или его сокращения в определении того, когда "объект больше не нужен".
Непосредственным преимуществом такого подхода является то, что циклы больше не являются проблемой. В первом примере, приведенном выше, после возврата вызова функции на эти два объекта больше не ссылается ни один ресурс, достижимый из глобального объекта. Следовательно, сборщик мусора сочтет их недоступными и вернет им выделенную память.
Однако невозможность вручную управлять сборкой мусора остается. Бывают случаи, когда было бы удобно вручную определять, когда и какая память будет освобождена. Чтобы освободить память объекта, его нужно сделать явно недоступным. В JavaScript также невозможно программно запустить сборку мусора - и, скорее всего, никогда не удастся в рамках основного языка, хотя движки могут предоставлять API за опциональными флагами.