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




1 Answers

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

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

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

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

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

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

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

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

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

js memory

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

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

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

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

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

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

Так что мы должны

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

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




Related

javascript memory-leaks garbage-collection circular-reference