认识V8

100 阅读2分钟

认识V8

  1. V8是一款主流的Javascript执行引擎
  2. V8采用即时编译
  3. V8内存设限

V8垃圾回收策略

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

V8如何回收新生代对象

V8内存分配

  1. V8内存空间一分为二
  2. 小空间用于存储新生代对象(32M|16M)
  3. 新生代指的是存活时间较短的对象

V8新生代对象回收实现

  1. 回收过程采用复制算法+标记整理
  2. 新生代内存区分为两个等大小空间
  3. 使用空间Form,空闲空间为To
  4. 活动对象存储于Form空间
  5. 标记整理后将活动对象拷贝至To
  6. Form与To交换空间完成释放
回收细节说明
  1. 拷贝过程中可能出现晋升
  2. 晋升就是将新生代对象移至老生代
  3. 一轮GC还存活的新生代需要晋升
  4. To空间的使用率超过25%

V8如何回收老生代对象

老年代对象说明

  1. 老年代对象存放在右侧老生代区域
  2. 64位操作系统1.4G,32操作系统700M
  3. 老年对象就是值存活时间较长的对象

老年代对象回收实现

  1. 主要采用标记清除、标记整理、增量标记算法
  2. 首先使用标记清除完成垃圾空间的回收
  3. 采用标记整理进行空间优化
  4. 采用增量标记进行效率优化

细节对比

  1. 新生代区域垃圾回收使用空间换时间
  2. 老生代区域垃圾回收不适合复制算法