Циркулярные ссылки в Javascript / Сборщик мусора - PullRequest
38 голосов
/ 08 сентября 2011

Может кто-нибудь объяснить подробно, как движки 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;

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

1 Ответ

62 голосов
/ 08 сентября 2011

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

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

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

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

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

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

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

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

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

...