V8 是一款主流的 JavaScript 执行引擎
V8 采用即时编译
V8 内存设限

  • 32位 < 800M
  • 64位 < 1.5G

    V8 垃圾回收策略

    采用分代回收的思想
    内存分为新生代、老生代
    针对不同对象采用不同算法
    image.png

    V8 中常用 GC 算法

    分代回收

    V8 内存空间一分为二

  • 小空间用于存储新生对象(32M | 16M)

  • 新生代对象指存活时间较短的对象
  • 老年代对象指存在时间较长的对象

回收新生代对象

  • 回收过程采用复制算法 + 标记整理
  • 新生代内存区分为两个等大小空间
    • 使用空间 From
      • 存储活动对象
    • 空闲空间 To
  • 标记整理后将活动空间对象拷贝至 To
    • 拷贝过程中可能出现晋升
  • From 与 To 交换空间完成释放

晋升

  1. - 晋升就是将新生代对象移动至老年代
  2. - 一轮 GC 还存活的新生代需要晋升
  3. - To 空间的使用率超过 25%

回收老年代对象

  • 64位 1.4G / 32位 700M
  • 主要采用标记清除、标记整理、增量标记算法
    • 首先使用标记清除完成垃圾空间的回收
    • 晋升时,老年代的空间不足以新生代移入的对象就会采用标记整理进行空间优化
    • 采用增量标记进行效率优化

image.png