javascript 垃圾回收机制及其两种算法:引用计数法 + 标记清除法

449 阅读2分钟

一,什么是垃圾回收机制
垃圾回收机制是一个底层处理的概念问题了解垃圾回收之前,我们要先了解一个概念:内存的生命周期
内存的生命周期:可以分为3个过程创建,使用,销毁
内存的创建:(声明一个变量,对象,函数,数组,new一个构造函数等--- 都会在内存上开辟一个空间
内存的使用: 对于变量,对象等的一些操作,比如:赋值,累加求和,获取dom元素,并修改属性等等
内存的回收:不再使用的变量,会被js引擎自动回收(注意:全局变量是关闭页面后浏览器才会自动销毁,函数里面的变量,在函数调用完毕以后,自动销毁),所以垃圾就是指:不再使用的内存。
垃圾回收机制就是指:一个程序不再使用的内存(无用内存),Javascript 会找出不再使用的变量,不再使用意味着这个变量生命周期的结束。其会被js引擎‘自动回收’; 如果不能自动回收,就造成‘内存泄露’。

<script>
  const a = 10 // 底层机制:在内存里面给我们的变量开辟了一个空间(内存),来储存这个变量
  function fn() {
    const b = 100;
  }
  fn() // 一个函数调用完以后,内部的变量就会被自动销毁
  console.log(a)
  console.log(b)
</script>

其中a为全局变量,关闭页面后浏览器才会自动销毁。b已经被回收了

image.png 二,垃圾回收机制的两种算法
1. 引用计数法: 一个值不再被引用(引用次数为0),那么这个值就会被清除,内存就会被自动回收。
那为什么还会出现第二种计数法: 因为引用计数法会存在一些问题 (循环引用的问题)会导致内存泄露

<script>
  function fn() {
    // 由于a和b互相循环引用,计数永远不可能为 0
    let a = {}
    let b = {}
    a.prop = b
    b.prop = b
  }
</script>

如上代码,a和b循环引用,计数永远不为0,造成内存泄漏
2. 标记清除法: 从顶级对象去查找某个变量,如果找不到,就标记这个变量,然后清除
现在浏览器主流都是用标记清除法