Выбор ответа Middle Память и сборка мусора обновлено

Циклические ссылки и сборщик мусора

Вопрос

Что будет с объектами a и b после выхода из функции?

function link() {
  const a = {};
  const b = {};
  a.partner = b;
  b.partner = a;
}
link();

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Станут недостижимы от корней и будут собраны, несмотря на цикл. Современные сборщики используют mark-and-sweep: живым считается только то, до чего можно дойти от корней (глобальный объект, стек, активные замыкания).

Варианты ответа

  1. Утекут: они ссылаются друг на друга и никогда не освободятся
  2. Освободится только a, потому что он создан первым и держит b
  3. Станут недостижимы от корней и будут собраны, несмотря на циклправильный ответ
  4. Попадут в глобальный объект, потому что ссылаются друг на друга

Разбор

Современные сборщики используют mark-and-sweep: живым считается только то, до чего можно дойти от корней (глобальный объект, стек, активные замыкания). После выхода из функции на пару нет ссылок снаружи, цикл внутри неё роли не играет, оба объекта будут собраны. Утечка из-за циклов была проблемой подсчёта ссылок, который в JS-движках не используется (исторически были проблемы в старом IE на стыке JS и DOM). В глобальный объект const не попадают.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.