V8 разработчик здесь.Краткий ответ: это сложно .В частности, разные движки JavaScript и разные версии одного и того же движка будут работать по-разному.
Чтобы ответить на ваши конкретные вопросы:
a) Когда включается сборщик мусора (он вызывается через некоторый интервал или должны выполняться некоторые условия)?
Зависит.Вероятно, оба.Современные сборщики мусора часто являются поколениями: у них относительно небольшое «молодое поколение», которое собирается, когда оно полно.Кроме того, у них гораздо большее «старое поколение», где они обычно выполняют свою работу небольшими шагами, чтобы никогда не прерывать выполнение слишком долго.Один из распространенных способов инициировать такой маленький шаг - это когда N байтов (или объектов) были выделены с момента последнего шага.Другим способом, особенно в современных браузерах с вкладками, является активация GC, когда вкладка неактивна или находится в фоновом режиме.Помимо этих двух, могут быть дополнительные триггеры.
b) Кто отвечает за сборку мусора (это часть движка JavaScript или браузера / узла)?
Мусорколлектор является частью движка JavaScript.Тем не менее, он должен иметь определенные взаимодействия с соответствующим устройством для внедрения, чтобы иметь дело с управляемыми объектами (например, узлами DOM), время жизни которых так или иначе связано с объектами JavaScript.
c) работает наосновная нить или отдельная нить?
Зависит.В современной реализации, как правило, оба варианта: некоторая работа выполняется в фоновом режиме (в одном или нескольких потоках), некоторые этапы в главном потоке более эффективны.
d) какой из следующихимеет более высокое пиковое использование памяти?
Эти два фрагмента (вероятно) будут иметь одинаковое пиковое использование памяти: ни один из них никогда не позволяет объектам, выделенным более чем одной итерацией, быть доступными одновременно.
Редактировать: если вы хотите узнать больше о последних работах, связанных с GC, которые выполняет V8, вы можете найти серию сообщений в блоге здесь: https://v8.dev/blog/tags/memory