前言
像C语言这样的底层语言一般都有底层的内存管理接口,比如 malloc()和free()。相反,JavaScript是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。 释放的过程称为垃圾回收。
什么是垃圾
一个简单的例子
let user = {
name: "John"
};
user引用了一个对象,这个对象还不是垃圾
当输入
user = null;时,2者之间的联系就断了,无法访问它,也没有对其的引用。垃圾收集器将垃圾数据并释放内存。
例外
当3者互相应用,形成一个环时,其中一方的联系断时,只要还有其他对象引用了,就不能当作垃圾
不过3者与外界的连接断了,形成一个环互相引用,而外界无法引用时,就会被算做垃圾
简单概括
没有被引用的对象是垃圾(引用别人是没有用的,只有被人引用才能不算垃圾),但是有个例外,互相引用的对象无法被外界引用时,也算做垃圾
垃圾回收算法
基本的垃圾收集算法称为“标记清除”。
定期执行以下“垃圾收集”步骤:
- 垃圾收集器扎根并“标记”(记住)它们。
- 然后,它访问并“标记”来自它们的所有引用。
- 然后,它访问标记的对象并标记其引用。记住所有访问过的对象,以免将来再次访问同一对象。
- …依此类推,直到访问了所有可到达的引用(从根开始)。
- 除标记对象外的所有对象均被删除。
优点
实现简单, 容易和其他算法组合
缺点
碎片化, 会导致无数小分块散落在堆的各处 分配速度不理想,每次分配都需要遍历空闲列表找到足够大的分块 与写时复制技术不兼容,因为每次都会在活动对象上打上标记
后续
这里只介绍了最简单的算法,想了解不同的算法