JS 垃圾回收机制

99 阅读2分钟
  • 什么是垃圾

    • 对象不再被引用

    • 对象无法从根上访问到

  • 常见的 GC 算法

    • 引用计数

    • 标记清除

    • 标记整理

    • 分代回收

  • 引用计数

    • 原理

      • 设置引用数,判断引用数是否为 0

      • 引用关系改变时修改引用数

      • 当引用数为 0 立即回收

    • 优点

      • 发现垃圾立即回收

      • 最大限度减少程序暂停

    • 缺点

      • 无法回收循环引用对象

      • 时间开销大

  • 标记清除

    • 原理

      • 分为标记和清除两个阶段

      • 标记:遍历所有对象,标记所有活动对象

      • 清除:清除没有标记的对象

      • 回收空间

    • 优点

      • 可以回收循环引用对象
    • 缺点

      • 内存空间碎片化

  • 标记整理

    • 原理

      • 与标记清除类似

      • 在清除之前先整理内存空间,移动对象位置

    • 优点

      • 减少碎片化空间
    • 缺点

      • 不会立即回收垃圾对象

      • 移动对象位置,回收效率慢

  • V8 垃圾回收

    • 原理

      • 采用分代回收,新生代与老生代的回收算法不同
    • 新生代回收过程

      • 复制算法 + 标记整理

      • 新生代内存分为两个等大小空间

      • 使用空间为 from, 空闲空间为 to

      • 活动对象存储到 from

      • 标记整理后将活动对象从 form copy 到 to

      • from 与 to 交换空间

    • 细节

      • copy 过程可能出现晋升

      • 晋升 === 新生代移动到老生代

      • 晋升条件 === 一轮 GG 还存活的新生代 or to 空间使用率超过 25%

    • 老生代回收

      • 采用标记清除, 标记整理, 增量标记

      • 使用标记清除完成垃圾空间的回收

      • 采用标记整理进行空间优化

      • 采用增量标记进行效率优化

  • 增量标记是什么

    程序执行和垃圾回收是两个不同过程,并且垃圾回收会阻塞程序执行,使用增量标记,将一次垃圾回收分为几次,这样不会阻塞程序执行