内存管理

125 阅读2分钟

内存管理介绍

  • 内存:由可读写单元组成,表示一片可操作空间。
  • 管理:认为的去操作一片空间的申请、使用和释放。
  • 内存管理:开发者主动申请空间、使用空间、释放空间。
  • 管理流程:申请-使用-释放。
//申请
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、标记整理

  • 标记整理可以看做是标记清除的增强
  • 标记阶段的操作和标记清除一致
  • 清除阶段会先执行整理,移动对象位置

优点:减少碎片化空间 缺点:不能立即回收

4、分代回收