1、内存管理
内存:由可读写单元组成,标识一片可操作的空间
管理: 认为的去操作一篇空间的申请、使用和释放
内存管理:开发者主动申请空间、使用空间、释放空间
管理流程: 申请-使用-释放
// 申请
let obj = {}
//使用
obj.name = 'zs'
//释放
obj = null
2、JavaScript可达对象
可达对象表示
- 可以访问到的对象就是可达对象(引用、作用域链)
- 可达的标准就是从根出发是否能够被找到
- JavaScript中的根就可以理解为是全局变量对象
3、JavaScript中的垃圾
- JavaScript中的内存管理是自动的
- 对象不再被引用时是垃圾
- 对象不能从根上访问到的时候是垃圾
4、GC定义与作用
- GC就是垃圾回收机制的简写
- GC可以找到内存中的垃圾、并释放和回收空间
GC算法是什么
GC是一种机制,垃圾回收器完成具体的工作
工作的内容就是查找垃圾释放空间、回收空间
算法就是工作时查找和回收所遵循的规则
常见的GC算法
引用计数、标记清除、标记整理、分代回收
5、引用计数算法
- 核心思想:设置引用数,判断当前引用数是否为o
- 引用计数器,记录引用数值
- 引用关系改变时,修改引用数字
- 引用数字为0时,立即回收
优点
- 发现垃圾是立即回收
- 最大限度减少程序暂停
缺点
- 无法回收循环引用的对象(因为引用数字不为0)
- 时间开销大(需要维持引用计数器)
6、标记清除算法
- 核心思想: 分标记和清除两个阶段完成
- 遍历所有对象找标记活动对象(给可达对象做标记)
- 遍历所有对象清除没有标记的对象
优点
- 解决了引用计数算法中无法回收循环引用对象的缺点
缺点
- 空间碎片化:由于当前回收的垃圾对象在地址上是不连续的,所以回收后空间分散再各个角落
7、标记整理算法
- 标记整理算法可以看作是标记清除的增强
- 标记阶段的操作和标记清除一直
- 清除阶段回先执行整理,移动对象位置,整理到一起,进而减少碎片化空间