内存的生命周期
- 分配 :程序执行期间,当创建新的变量,函数,对象等元素时会向操作系统请求内存空间来存储这些数据
- 使用 :内存被分配后使用变量,函数等会进行内存的读写
- 释放 :当程序不再需要某个对象或变量时,将进行内存释放
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.标记清除法
目前大部分浏览器用的垃圾回收算法
策略:
将“不再使用的对象”定义为“⽆法到达的对象“
- 垃圾回收器从根节点出发,遍历内存中的所有对象,标记在使用内存的对象
- 垃圾回收器扫描整个内存空间,找到未被标记的对象,并把他们清除
标记清除法也有一些缺点比如清理大量内存之后导致的内存碎片化