内存管理介绍
- 内存:由可读写单元组成,表示一片可操作空间。
- 管理:认为的去操作一片空间的申请、使用和释放。
- 内存管理:开发者主动申请空间、使用空间、释放空间。
- 管理流程:申请-使用-释放。
//申请
let obj = {}
//使用
obj.name = 'snail'
//释放
obj = null
JavaScript中的垃圾
- JavaScript 中内存管理是自动的
- 对象不再被引用时是垃圾
- 对象不能从根本上访问到时是垃圾
JavaScript中的可达对象
- 可以访问到的对象就是可达对象(引用、作用域链)
- 可达的标准就是从根本出发是否能够被找到
- JavaScript中的根就可以理解为是全局变量对象
//引用
let obj = {name:'xm'}
let ali = obj
obj = null
console.log(ali);//{ name: 'xm' }
//{ name: 'xm' } 依旧是可达对象
GC 垃圾
- GC是一种机制,垃圾回收器完成具体的工作。
- 工作的内容就是查找垃圾释放空间、回收空间。
- 算法就是工作时查找和回收所遵循的规则
常见GC算法
1、引用计数
- 核心思想:设置引用数,判断当前引用数是否为0
- 引用计数器
- 引用关系改变时修改引用数字
- 引用数字为0时立即回收
优点:发现垃圾立即回收,最大限度减少程序暂停 缺点:无法回收循环引用的对象,时间开销大
2、标记清除
- 核心思想:分标记和清除二个阶段完成
- 遍历所有对象找标记活动对象
- 遍历所有对象清除没有标记对象
- 回收相应的空间
优点:相对于引用计数来说,解决循环引用不能回收的问题。 缺点:相对于之前的垃圾回收来说,会产生空间碎片化的问题,不能让空间最大化使用。
3、标记整理
- 标记整理可以看做是标记清除的增强
- 标记阶段的操作和标记清除一致
- 清除阶段会先执行整理,移动对象位置
优点:减少碎片化空间 缺点:不能立即回收