认识V8
认识V8
- V8是一款主流的Javascript执行引擎
- V8采用即时编译
- V8内存设限
V8垃圾回收策略
- 采用分代回收的思想
- 内存分为新生代、老生代
- 针对不同的对象采用不同算法
V8中常用的GC算法
- 分代回收
- 空间复制
- 标记清除
- 标记整理
- 标记增量
V8如何回收新生代对象
V8内存分配
- V8内存空间一分为二
- 小空间用于存储新生代对象(32M|16M)
- 新生代指的是存活时间较短的对象
V8新生代对象回收实现
- 回收过程采用复制算法+标记整理
- 新生代内存区分为两个等大小空间
- 使用空间Form,空闲空间为To
- 活动对象存储于Form空间
- 标记整理后将活动对象拷贝至To
- Form与To交换空间完成释放
回收细节说明
- 拷贝过程中可能出现晋升
- 晋升就是将新生代对象移至老生代
- 一轮GC还存活的新生代需要晋升
- To空间的使用率超过25%
V8如何回收老生代对象
老年代对象说明
- 老年代对象存放在右侧老生代区域
- 64位操作系统1.4G,32操作系统700M
- 老年对象就是值存活时间较长的对象
老年代对象回收实现
- 主要采用标记清除、标记整理、增量标记算法
- 首先使用标记清除完成垃圾空间的回收
- 采用标记整理进行空间优化
- 采用增量标记进行效率优化
细节对比
- 新生代区域垃圾回收使用空间换时间
- 老生代区域垃圾回收不适合复制算法