Когда и как работает JavaScript сборщик мусора - PullRequest
2 голосов
/ 25 сентября 2019

Я прочитал несколько статей, таких как , в MDN и , в этой . Я получил представление о том, как происходит GC в JavaScript

Я до сих пор ничего не понимаюкак

a) Когда включается сборщик мусора (он вызывается через некоторый интервал или когда должны выполняться некоторые условия)?

b) Кто отвечает за сборку мусора (это часть движка JavaScriptили браузер / узел)?

c) работает в главном потоке или отдельном потоке?

d) у какого из перечисленных ниже пиковое использование памяти выше?

// (i) first-case
// variables will be unreachable after each cycle

(function() {
  for (let i = 0; i < 10000; i++) {
    let name = 'this is name' + i;
    let index = i;
  }
})()
// (ii) second-case

(function() {
  let i, name, index; // creating variable once

  for (i = 0; i < 10000; i++) {
    name = 'this is name' + i;
    index = i;
  }
})()

1 Ответ

3 голосов
/ 25 сентября 2019

V8 разработчик здесь.Краткий ответ: это сложно .В частности, разные движки JavaScript и разные версии одного и того же движка будут работать по-разному.

Чтобы ответить на ваши конкретные вопросы:

a) Когда включается сборщик мусора (он вызывается через некоторый интервал или должны выполняться некоторые условия)?

Зависит.Вероятно, оба.Современные сборщики мусора часто являются поколениями: у них относительно небольшое «молодое поколение», которое собирается, когда оно полно.Кроме того, у них гораздо большее «старое поколение», где они обычно выполняют свою работу небольшими шагами, чтобы никогда не прерывать выполнение слишком долго.Один из распространенных способов инициировать такой маленький шаг - это когда N байтов (или объектов) были выделены с момента последнего шага.Другим способом, особенно в современных браузерах с вкладками, является активация GC, когда вкладка неактивна или находится в фоновом режиме.Помимо этих двух, могут быть дополнительные триггеры.

b) Кто отвечает за сборку мусора (это часть движка JavaScript или браузера / узла)?

Мусорколлектор является частью движка JavaScript.Тем не менее, он должен иметь определенные взаимодействия с соответствующим устройством для внедрения, чтобы иметь дело с управляемыми объектами (например, узлами DOM), время жизни которых так или иначе связано с объектами JavaScript.

c) работает наосновная нить или отдельная нить?

Зависит.В современной реализации, как правило, оба варианта: некоторая работа выполняется в фоновом режиме (в одном или нескольких потоках), некоторые этапы в главном потоке более эффективны.

d) какой из следующихимеет более высокое пиковое использование памяти?

Эти два фрагмента (вероятно) будут иметь одинаковое пиковое использование памяти: ни один из них никогда не позволяет объектам, выделенным более чем одной итерацией, быть доступными одновременно.


Редактировать: если вы хотите узнать больше о последних работах, связанных с GC, которые выполняет V8, вы можете найти серию сообщений в блоге здесь: https://v8.dev/blog/tags/memory

...