【问题标题】:When and How JavaScript garbage collector worksJavaScript 垃圾收集器何时以及如何工作
【发布时间】:2020-01-25 18:32:21
【问题描述】:

我确实阅读了几篇文章,例如 this on MDNthis one,我了解了 GC 是如何在 JavaScript 中发生的

我还是不明白

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

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;
  }
})()
// second-case
// creating variable once

(function() {
  let i, name, index;

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

【问题讨论】:

    标签: javascript garbage-collection v8 spidermonkey


    【解决方案1】:

    V8 开发人员在这里。简短的回答是:很复杂。特别是,不同的 JavaScript 引擎,以及同一引擎的不同版本,会做不同的事情。

    解决您的具体问题:

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

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

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

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

    c) 在主线程或单独线程上运行?

    视情况而定。在现代实现中,通常两者兼有:一些工作发生在后台(在一个或多个线程中),一些步骤在主线程上执行效率更高。

    d) 以下哪一项具有更高的峰值内存使用率?

    这两个 sn-ps 将(可能)具有相同的峰值内存使用量:它们都不允许同时访问多个迭代分配的对象。


    编辑:如果你想了解更多关于 V8 近期 GC 相关工作的内容,你可以在这里找到一系列博文:https://v8.dev/blog/tags/memory

    【讨论】:

      猜你喜欢
      • 2011-01-26
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2019-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多