Skip to content

Latest commit

 

History

History
45 lines (29 loc) · 2.12 KB

垃圾回收.md

File metadata and controls

45 lines (29 loc) · 2.12 KB

垃圾回收

对于开发者来说,JavaScript 的内存管理是自动的、无形的。我们创建的原始值、对象、函数……这一切都会占用内存。

当我们不再需要某个东西时会发生什么?JavaScript 引擎如何发现它并清理它?

可达性(Reachability)

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

简而言之,“可达”值是那些以某种方式可访问或可用的值。它们一定是存储在内存中的。

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

比方说:

当前执行的函数,它的局部变量和参数。 当前嵌套调用链上的其他函数、它们的局部变量和参数。 全局变量。 (还有一些内部的) 这些值被称作 根(roots)。

  • 如果一个值可以通过引用链从根访问任何其他值,则认为该值是可达的。

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

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

内部算法

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

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

  • 垃圾收集器找到所有的根,并“标记”(记住)它们。
  • 然后它遍历并“标记”来自它们的所有引用。
  • 然后它遍历标记的对象并标记 它们的 引用。所有被遍历到的对象都会被记住,以免将来再次遍历到同一个对象。
  • ……如此操作,直到所有可达的(从根部)引用都被访问到。
  • 没有被标记的对象都会被删除。

总结

主要需要掌握的内容:

  • 垃圾回收是自动完成的,我们不能强制执行或是阻止执行。
  • 当对象是可达状态时,它一定是存在于内存中的。
  • 被引用与可访问(从一个根)不同:一组相互连接的对象可能整体都不可达,正如我们在上面的例子中看到的那样。