V8简介
众所众知,V8是一款主流的js执行引擎,在js执行过程中,我们不需要关心垃圾回收的问题,这是因为V8已经帮我们做了这件事,V8的内容是有限的,而且32位和64位设置的内容上限不同。
常见GC算法如下:https://editor.csdn.net/md/?articleId=122502543
V8回收策略
V8采用分代回收的思想,
即将内存划分为两个区域,一个叫新生代区域,一个叫老生代区域
- 新生代区域:
- 负责短期生命周期的对象,如临时变量。占据内存较小。
- 老生代对象:
- 负责长期生命周期的对象,如全局变量,占据内存大。
新生代区域处理
- 主要采用复制算法和标记整理算法
- 由于新生代内存较小(32m或16m),且存储的对象为存活较短的对象,这里将新生代内容一分为二,使用空间为from,空闲空间为to。
- 将活动对象存储到from空间中,当该空间存储到一定阶段,开始进行垃圾回收。
- 对from中的对象进行标记整理,并将整理的活动对象移动到to空间中,并将to和from互相交换,这样就完成了一次垃圾回收,保证了from空间里都是活动对象。
- 但是,from空间毕竟有限,如果全是活动对象,就需要对对象进行晋升,将一些周期较长的对象晋升到老生代区域中。
老生代区域的处理
- 老生代区域内存较大,采用复制算法明显耗时较长,不利于用户体验。
- 首先采用标记清楚算法,筛选出活动的对象。
- 在采用标记整理,将空间进行优化
- 同时可以结合增量标记算法兼顾优化效率