• 介绍

      • V8 是一款主流的 JavaScript 执行引擎
      • V8 采用及时编译
      • V8 内存设限 (64位 上限不超过 1.5G 32位 上限不超过 800 M)
    • 垃圾回收策略

      • 采用分代回收的思想
      • 内存分为新生代、老生代
      • 针对不同对象采用不同算法
      • V8 中常用的 GC 算法
        • 分代回收
        • 空间复制
        • 标记清除
        • 标记整理
        • 标记增量
    • V8 如何回收新生代对象

      • V8 内存分配
        • V8 内存空间一分为二
        • 小空间用于存储新生代对象 (32M | 16M)
        • 新生代指的是存活时间较短的对象
      • 新生代对象回收实现
        • 回收过程采用复制算法 + 标记整理
        • 新生代内存区分为两个等大小空间
        • 使用空间为From,空闲空间为 To
        • 活动对象存储与 From 空间
        • 标记整理后将活动对象拷贝至 To
        • From 与 To 交换空间完成释放
      • 回收细节说明
        • 回收过程中可能出现晋升
        • 晋升就是将新生代对象移动至老生代、
        • 一轮 GC 还存活的新生代需要晋升
        • To 空间的使用率超过 25%,则将活动对象晋升
    • V8 如何回收老生代对象

      • 老生代对象说明
        • 老生代对象存放在右侧老生代区域
        • 64位操作系统1.4G,32位操作系统 700M
      • 老生代对象回收实现
        • 主要采用标记清除、标记整理、增量标记算法
        • 首先使用标记清除完成垃圾空间的回收
        • 采用标记整理进行空间优化 (晋升时候,且老生代空间不足的时候)
        • 采用增量标记进行效率优化
      • 细节对比
        • 新生代区域垃圾回收使用空间换时间
        • 老生代区域垃圾回收不适合复制算法,空间太大了,一分为二浪费,复制也浪费时间
      • 标记增量如何优化垃圾回收
        • 增量标记是对标记清除算法对优化,让其不会一口气的去寻找到所有活动对象。而是会穿插在程序的运行中执行,降低了程序的卡顿,当标记彻底采集完毕之后,才会把程序停下来,进行垃圾回收。