js的垃圾回收机制

93 阅读2分钟

内存的生命周期

  • 分配 :程序执行期间,当创建新的变量,函数,对象等元素时会向操作系统请求内存空间来存储这些数据
  • 使用 :内存被分配后使用变量,函数等会进行内存的读写
  • 释放 :当程序不再需要某个对象或变量时,将进行内存释放

js的垃圾回收机制

1.前言

  • js的垃圾回收是自动进行的,一般情况下当局部变量不再使用时会被回收,全局变量在网页关闭时会被回收
  • 基础数据类型会存储在栈中,由操作系统进行内存的分配释放
  • 复杂数据类型存储在堆中,由垃圾回收机制管理
  • 垃圾回收的目的就是回收(释放)用不到内存(垃圾)

2.引用计数法

这是一种早期IE浏览器的垃圾回收机制,内存是否在使用 => 一个对象是否有指向它的引用

策略:标记清除法记录下在操作过程中一个对象的被引用次数,每被引用一次就把次数++,减少一个引用就把次数--,当没有被引用时就进行垃圾回收

let a = [1,2] //数组第一次被引用
let b = a //数组第二次被引用
a = null //a指向数组的引用消失
b = null //b指向数组的引用消失
//数组的引用为0进行垃圾回收

但是这种算法存在着一种问题:循环引用

function fun(){
    let A = {}
    let B = {}
    //A,B相互引用,最后次数剩1不会被清除,无法回收,造成内存泄漏
    A.a = B
    B.a = A
}

3.标记清除法

目前大部分浏览器用的垃圾回收算法

策略:

将“不再使用的对象”定义为“⽆法到达的对象“

  • 垃圾回收器从根节点出发,遍历内存中的所有对象,标记在使用内存的对象
  • 垃圾回收器扫描整个内存空间,找到未被标记的对象,并把他们清除

标记清除法也有一些缺点比如清理大量内存之后导致的内存碎片化