浏览器_GC - zen0822/interview GitHub Wiki

GC

可达性

JavaScript 中主要的内存管理概念是可达性

简而言之,『可达』值是那些以某种方式可访问或可用的值。它们保证存储在内存中。

  1. 这里列出固有的可达值基本集合,这些值明显不能被释放。

    比方说:

    • 当前函数的局部变量和参数。
    • 嵌套调用时,当前调用链上所有函数的变量与参数。
    • 全局变量。
    • (还有一些内部的)

    这些值被称作根。

  2. 如果一个值可以通过引用或引用链,从根值访问到,则认为这个值是可达的。

    比方说,如果局部变量中有一个对象,并且该对象具有引用另一个对象的 property,则该对象被认为是可达的。而且它引用的内容也是可达的。下面是详细的例子。

在 JavaScript 引擎中有一个被称作垃圾回收器的东西在后台执行。它监控着所有对象的状态,并删除掉那些已经不可达的。

内部算法

垃圾回收的基本算法被称为 “mark-and-sweep”。

定期执行以下“垃圾回收”步骤:

  • 垃圾收集器找到所有的根,并“标记”(记住)它们。
  • 然后它遍历并"标记"来自它们的所有参考。
  • 然后它遍历到标记的对象并标记他们的引用。所有被遍历到的对象都会被记住,以免将来再次遍历到同一个对象。
  • …一直这样,直到有未访问的引用(从根访问到)。

没有被标记的所有对象都被删除。

图片:垃圾回收过程

参考

垃圾回收 Node.js内存管理和V8垃圾回收机制

面试参考

简要说说浏览器的垃圾回收

js 的内存管理主要是‘可达性’,算法是用 “mark-and-sweep” 标记,Mark-Sweep 处理时分为标记、清除两个步骤。