垃圾回收机制

229 阅读2分钟

今天学习了垃圾回收机制,这里作为记录。

(一)首先什么是垃圾,垃圾 -> 不在需要(物品)===垃圾 , 所以代码中不在需要的东西就是垃圾

举例1: (全局变量都不是垃圾) var a = 1 // 这是垃圾吗? // 当然不是, 为啥呢? 如果还是这句代码 Var a = 1 // 但是写了好多代码突然有一句 console.log(a) // 他是全局变量,随时会用,所以不是垃圾

举例2: function () { var b = 1 Console.log(b) } // 那么这个b是垃圾吗 // 这就需要第二个概念,往下看

(二)生命周期

// 还是这个函数 function test() { var b = 1 Console.log(b) } // 我们要知道b这个东西是什么时候产生的他的生命周期是啥 // 1. 所以是当函数执行时test() // 2. b才出现在内存里,b才产生 // 3. 然后打印b,然后默认return结束函数 // 然后test(), 这句代码执行结束,这时b结束,变为垃圾

但是我们会想,我们再执行函数不是还会用到吗,仔细品一下,再执行也会再创建b,但是上次执行的b再也没有用了(新的b和旧的b是两个b) 也可以理解为,b的作用域只在函数内,函数结束他也就没有用了,每次执行函数创建变量都是一个新的局部变量,所以每次的b就铁定是垃圾了

(三) 内存层面理解

举例3:

  1. window对象,全局变量,申明的函数。他们都是全局作用域的变量
  2. 但是像函数test创建变量b形成临时的作用域,test和变量b的关系像引用,也想闭包
  3. 但是比如a变量存储的是一块内存地址,接着如果给a赋值,a=null,那么刚才的内存地址就是垃圾
  4. 如果一块内存地址有两个变量a,b同时存储,这是a赋值为null时,因为有b还在用,所以这块地址不是垃圾

总结:这里其实就是对于垃圾的标记,只要有人用你就不是垃圾,即使是null,其他人在用也不是垃圾,如果是环引用的话,只要有人用你就不是垃圾,断开了就是垃圾

(四)垃圾回收的算法

  1. 标记-清除-算法,就是去找是否引用,引用就标记,去扫一遍,没有标记到的就是垃圾,然后将没有标记的删除(缺点:每次都需要便利,js是单线程的,所以也很耗时间 )
  2. 计数算法,增量式GC,分代回收