JS垃圾回收笔记

190 阅读2分钟

前言

像C语言这样的底层语言一般都有底层的内存管理接口,比如 malloc()和free()。相反,JavaScript是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。 释放的过程称为垃圾回收。

什么是垃圾

一个简单的例子

let user = {
  name: "John"
};

user引用了一个对象,这个对象还不是垃圾 当输入user = null;时,2者之间的联系就断了,无法访问它,也没有对其的引用。垃圾收集器将垃圾数据并释放内存。

例外

当3者互相应用,形成一个环时,其中一方的联系断时,只要还有其他对象引用了,就不能当作垃圾

不过3者与外界的连接断了,形成一个环互相引用,而外界无法引用时,就会被算做垃圾

简单概括

没有被引用的对象是垃圾(引用别人是没有用的,只有被人引用才能不算垃圾),但是有个例外,互相引用的对象无法被外界引用时,也算做垃圾

垃圾回收算法

基本的垃圾收集算法称为“标记清除”。

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

  1. 垃圾收集器扎根并“标记”(记住)它们。
  2. 然后,它访问并“标记”来自它们的所有引用。
  3. 然后,它访问标记的对象并标记其引用。记住所有访问过的对象,以免将来再次访问同一对象。
  4. …依此类推,直到访问了所有可到达的引用(从根开始)。
  5. 除标记对象外的所有对象均被删除。

优点

实现简单, 容易和其他算法组合

缺点

碎片化, 会导致无数小分块散落在堆的各处 分配速度不理想,每次分配都需要遍历空闲列表找到足够大的分块 与写时复制技术不兼容,因为每次都会在活动对象上打上标记

后续

这里只介绍了最简单的算法,想了解不同的算法

图片来源