Js 的内存管理跟垃圾回收机制
首先分两种情况:V8 将内存分成 新生代空间 和 老生代空间
- 新生代空间: 用于存活较短的对象
- 又分成两个空间: from 空间 与 to 空间
- Scavenge GC 算法: 当 from 空间被占满时,启动 GC 算法
- 存活的对象从 from space 转移到 to space
- 清空 from space
- from space 与 to space 互换
- 完成一次新生代 GC
- 老生代空间: 用于存活时间较长的对象
- 从 新生代空间 转移到 老生代空间 的条件(这个过程称为对象晋升)
- 经历过一次以上 Scavenge GC 的对象
- 当 to space 体积超过 25%
- 标记清除算法:标记存活的对象,未被标记的则被释放
- 增量标记:小模块标记,在代码执行间隙执,GC 会影响性能
- 并发标记:不阻塞 js 执行
- 从 新生代空间 转移到 老生代空间 的条件(这个过程称为对象晋升)
内存管理
JavaScript 是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。释放的过程称为垃圾回收
内存生命周期
不管什么程序语言,内存生命周期基本是一致的:
分配你所需要的内存 使用分配到的内存(读、写) 不需要时将其释放\归还
- JavaScript 的内存分配
- 值的初始化
- 为了不让程序员费心分配内存,JavaScript 在定义变量时就完成了内存分配。
- 通过函数调用分配内存
- 有些函数调用结果是分配对象内存
- 有些方法分配新变量或者新对象
- 值的初始化
- 使用值
- 使用值的过程实际上是对分配内存进行读取与写入的操作。读取与写入可能是写入一个变量或者一个对象的属性值,甚至传递函数的参数。
- 当内存不再需要使用时释放
- 大多数内存管理的问题都在这个阶段。在这里最艰难的任务是找到“哪些被分配的内存确实已经不再需要了”。
垃圾回收
如上文所述自动寻找是否一些内存“不再需要”的问题是无法判定的。因此,垃圾回收实现只能有限制的解决一般问题。
- 引用
- 引用计数垃圾收集
- 标记-清除算法