考虑到浏览器中使用 和 内存回收的效率。 V8限制了内存大小:
64G:1.5G
32位:800M
V8垃圾回收策略
- 采用分代回收的思想
- 内存分为新生代和老生代
-
不同对象采用不同的算法
V8涉及到的GC算法
- 分代回收
- 空间复制
- 标记清除
- 标记整理
- 标记增量
V8内存分配
- 空间一分为二
- 小空间存储新生代对象 (32M | 16M)
- 新生代是存活时间较短的对象 (局部变量等)
- 老年代对象存放在右侧区域 (1.4G | 700M)
- 老年代是存活时间较长的对象(全局变量、block内变量等)
新生代内存回收
- 回收过程采用复制算法 + 标记整理
- 新生代内存区分为二个等大小空间
- 使用空间是From, 空闲空间是To
- 活动对象存储于From空间
- 标记整理后将活动对象拷贝到To
- From 和 To 交换空间完成释放
- 拷贝过程中可能出现晋升
- 晋升就是新生代对象移动到老生代
- 一轮GC还存活的新生代需要晋升
- To空间使用率超过25%需要晋升
Why?
老生代内存回收
- 标记清除、标记整理、增量标记算法
- 首先使用标记清除完成垃圾空间回收
- 采用标记整理进行空间优化
- 采用增量标记进行效率优化
当前内存不够To晋升的时候,就会先进行标记整理
增量标记图示
新生代 VS 老生代
- 新生代 空间换时间
- 老生代 不适合复制算法
老生代空间大,复制成本很高
总结
- 一款主流的JS执行引擎
- 有内存设置上限
- 采用分代回收来实现垃圾回收
- 内存分为新生代 & 老生代
- 垃圾回收的常见GC算法
网友评论