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 在定义变量时就完成了内存分配。
    • 通过函数调用分配内存
      • 有些函数调用结果是分配对象内存
      • 有些方法分配新变量或者新对象
  • 使用值
    • 使用值的过程实际上是对分配内存进行读取与写入的操作。读取与写入可能是写入一个变量或者一个对象的属性值,甚至传递函数的参数。
  • 当内存不再需要使用时释放
    • 大多数内存管理的问题都在这个阶段。在这里最艰难的任务是找到“哪些被分配的内存确实已经不再需要了”。

垃圾回收

如上文所述自动寻找是否一些内存“不再需要”的问题是无法判定的。因此,垃圾回收实现只能有限制的解决一般问题。

  • 引用
  • 引用计数垃圾收集
  • 标记-清除算法
上次更新:
Contributors: jiangjingmin