JavaScript 垃圾回收

javascript

JavaScript 垃圾回收

创建的原始值、对象、函数等一切都会占用内存,当我们不再需要某变量或数据时,JavaScript 引擎会自动地进行清除,该操作称为垃圾回收。

Tip

参考:垃圾回收

可达性

可达性 Reachability 是指数据以某种方式可访问或可用,它们一定是存储在内存中的。这是 JavaScript 内存管理的主要概念。

当一个数据是可达的它就不会被垃圾回收器(一个在JavaScript 引擎后台执行的程序,它监控着所有对象的状态)删除。

可达值的基本集合(这些值明显不能被释放):

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

这些值被称作 根 roots

此外,如果是通过引用或引用链从根访问任何其他值,则认为该值是可达的。如局部变量中(引用)有一个对象,并且该对象有一个属性引用了另一个对象,则该对象被认为是可达的,而且它引用的内容(嵌套)也是可达的。

js
// user 具有对这个对象的引用
let user = {
  name: "John"
};

箭头描述了一个对象引用。全局变量 user 引用了对象 {name:"John"},则此时对象是可达的。

reachability
reachability

如果 user 的值被重写了,这个引用就没了,即对象变成不可达的了,垃圾回收器会认为它是垃圾数据并进行回收,然后释放内存。

delete-assign
delete-assign

内部算法

垃圾回收的基本算法被称为 mark-and-sweep,其步骤如下:

1/0
内存初始状态(右侧有一个「无法到达的岛屿」)
标记所有的根
遍历标记所有的直接引用
一直不断标记,直至所有从根部发出的引用都被标记
删除未标记的数据

Copyright © 2024 Ben

Theme BlogiNote

Icons from Icônes