Подтвердить что ты не робот

Циркулярные ссылки в сборщике Javascript/мусора

Может кто-нибудь объяснить подробно, как двигатели Javascript используют циркулярные ссылки? Есть ли большая разница между браузерами или даже node.js?

Я говорю о явной обратной/следующей ссылке в объектах. Например:

var objA = {
    prop: "foo",
    next: null
};

var objB = {
    prop: "foo",
    prev: null
};

objA.next = objB;
objB.prev = objA;

Там мы идем. Если мы сделаем a console.log( objA ), мы увидим, что мы создали бесконечную цепочку. Большой вопрос: это плохо? Это создает утечку памяти при неявной очистке?

Итак, мы должны

objA.next = null;
objB.prev = null;

или сборщики мусора позаботятся о нас на таких созвездиях?

4b9b3361

Ответ 1

Любой полупристойный сборщик мусора будет обрабатывать циклы.

Циклы - это только проблема, если вы делаете наивный подсчет ссылок.

Большинство сборщиков мусора не выполняют ref-counting (как потому, что не могут обрабатывать циклы, а потому, что они неэффективны). Вместо этого они просто следуют каждой ссылке, которую они могут найти, начиная с "корней" (обычно глобальных переменных и переменных на основе стека) и отмечают все, что они могут найти как "достижимые".

Затем они просто восстанавливают всю другую память.

Циклы не проблема, потому что они просто означают, что один и тот же node будет достигнут несколько раз. После первого раза node будет отмечен как "достижимый", и поэтому GC узнает, что он уже существует, и пропустите node.

Еще более примитивный GC на основе подсчета ссылок обычно реализует алгоритмы для обнаружения и прерывания циклов.

Короче говоря, это не то, о чем вам нужно беспокоиться. Я, кажется, помню, что IE6 Javascript GC фактически не справлялся с циклами (я мог ошибаться, прошло некоторое время с тех пор, как я его прочитал, и это было намного больше, так как я коснулся IE6), но в любой современной реализации это не проблема.

Весь сборщик мусора - это абстрагирование управления памятью. Если вам нужно выполнить эту работу самостоятельно, ваш GC сломан.

См. MDN для получения дополнительной информации о современной сборке мусора и используемых алгоритмах маркировки и развертки.