1.js 内存生命周期
js没有暴露任何内存操作给开发者,而是自己默默地完成了所有的管理动作。
- ”挖坑“:分配内存
- ”用坑“:内存的读和写操作
- ”还坑“:内存的释放
2.栈内存和堆内存
let a = 0;
let b = "Hello World"
let c = null;
let d = { name: '修言' };
let e = ['修言', '小明', 'bear'];
访问a、b、c三个变量时,由于是基本类型,从栈中直接获取该变量的值。
访问d和e时,由于是引用类型,先从栈中获取变量对应对象的引用(即它在堆内存中的地址),再拿着地址去堆内存空间查询。
3.垃圾回收机制
- 引用计数法
- 标记清除法
3-1 标记清除法
- 遍历所有可访问的对象。
- 回收不可访问的对象。
当变量进入环境时,如在函数中声明 一个变量,就将该变量标记为“进入环境”。从逻辑上讲永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能用到它。
而当变量离开环境时,则将变量标记为“离开环境”。
3-1 引用计数法
跟踪记录每个值被引用的次数,当一个值被引用时,次数+1,减持时-1,下次垃圾回收器会回收次数为0的值的内存。(容易出循环引用的bug)