Js 垃圾回收 GC算法

239 阅读2分钟
/** * 内存管理 *//** * 垃圾回收 * 浏览器自动进行申请内存,释放内存,回收内存的 *//** * GC算法 * 常见的GC算法 * 1. 引用计数 * 实现原理 *      对象内存都会有一个计数器进行记录对其引用数量,在对象变化时,计数器也会变化,为0时,进行垃圾回收 * 优点 *      1.1 发现垃圾时,立即回收。当对象引用数为0时,立即对其内存进行回收 *      1.2 最大限度减少程序暂停。当程序运行时,内存可能会占满,此时引用计数算法会去寻找引用数为0的对象,对其内存进行垃圾回收,从而释放内存,减少程序暂停。 * 缺点 *      1.3 无法回收循环引用的对象   *          function fn1() { *              const obj1 = {} *              const obj2 = {} *  *              obj1.name = obj2 *              obj2.name = obj1 *          } *          fn1() *          在fn1执行完之后,其内部的obj1obj2的内存无法释放,因为两者相互对其就行引用,这种现象叫做对象循环引用,从而浪费内存 *      1.4 时间开销大。因为要监听对象的变化来修改对象引用,对象变化本身+监听对象变化都要花费时间,故时间开销较大 * 2. 标记清除 * 实现原理 *      1. 遍历所有的对象,然后标记所有活动对象(可达对象:存在引用,在根上能够找到的对象) *      2. 遍历所有的对象,然后清除没有标记的对象,同时将第一次遍历中的标记清除掉 *          注意⚠️:同时还会把清除对象之后的剩余空间放到一个叫空闲链表中,方便之后使用 * 优点: *      可以解除循环对象垃圾回收问题,因循环对象不能在根上找到,不为可达对象,所以可以垃圾回收,不像上面的引用计数。 * 缺点: *      因为每个对象对应的一块空间,当将剩余空间放到空闲链表中时,由于清楚对象之后的剩余空间的地址不连续,所以造成了空间碎片化的现象。对后续冲空间链表中申请空间时,有很大的影响 * 3. 标记整理 * 实现原理 *      在标记清除的基础上,在第二次遍历清除对象之前,会将所有的活动对象在内存上进行移动,变成连续状态,之后将剩余的空间(肯定也变成连续的了)进行回收,进而避免了空间碎片化  * 4. 分代回收 */