JavaScript垃圾收集器的工作时间和工作方式

JavaScript垃圾收集器的工作时间和工作方式,javascript,garbage-collection,v8,spidermonkey,Javascript,Garbage Collection,V8,Spidermonkey,我确实读了一些文章,比如,我了解了JavaScript中GC是如何发生的 我还是不明白这样的事情 垃圾收集器何时启动?它在某个时间间隔或某些条件必须满足后被调用 b谁负责垃圾收集?它是JavaScript引擎或浏览器/节点的一部分 c在主线程上运行还是在独立线程上运行 d以下哪项具有较高的峰值内存使用率 // first-case // variables will be unreachable after each cycle (function() { for (let i = 0;

我确实读了一些文章,比如,我了解了JavaScript中GC是如何发生的

我还是不明白这样的事情

垃圾收集器何时启动?它在某个时间间隔或某些条件必须满足后被调用

b谁负责垃圾收集?它是JavaScript引擎或浏览器/节点的一部分

c在主线程上运行还是在独立线程上运行

d以下哪项具有较高的峰值内存使用率

// 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;
  }
})()

这里是V8开发者。简单的回答是:这很复杂。特别是,不同的JavaScript引擎和同一引擎的不同版本会做不同的事情

要解决您的具体问题:

垃圾收集器何时启动?它在某个时间间隔或某些条件必须满足后被调用

视情况而定。可能两者都有。现代垃圾收集器通常是分代的:他们有一个相对较小的年轻一代,只要垃圾满了就会被收集。此外,他们有一个更大的老一代,他们通常在许多小步骤中完成他们的工作,以便永远不会中断执行太长时间。触发这样一个小步的一种常见方法是,自上一步以来分配了N个字节或对象。另一种方法,特别是在现代的选项卡浏览器中,是在选项卡处于非活动状态或处于后台时触发GC活动。除了这两个因素之外,很可能还有其他因素

b谁负责垃圾收集?它是JavaScript引擎或浏览器/节点的一部分

垃圾收集器是JavaScript引擎的一部分。这就是说,它必须与相应的嵌入式程序进行某些交互,以处理嵌入式程序管理的对象,例如生命周期以某种方式与JavaScript对象绑定的DOM节点

c在主线程上运行还是在独立线程上运行

视情况而定。在现代实现中,通常两者都有:一些工作在一个或多个线程的后台进行,一些步骤在主线程上执行更有效

d以下哪项具有较高的峰值内存使用率

// 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;
  }
})()
这两个代码段可能具有相同的峰值内存使用率:它们都不允许同时访问由多个迭代分配的对象

编辑:如果您想阅读更多关于V8最近与GC相关的工作,您可以在这里找到一系列博客文章: