一、简单介绍V8引擎
- V8引擎是一款主流的JavaScript执行引擎;
- V8执行引擎采用及时编译(执行速度提升);
- V8引擎中内存设置有上限(下方进行详解);
二、V8回收策略
- 采用分代回收思想;
- 内存分为新生代对象存储与老生代对象存储;
- 针对不同的对象采用不同的算法;
三、常用的GC算法(垃圾回收机制)
- 分代回收
- 空间复制
- 标记清除
- 标记整理
- 增量算法
四、V8内存分配
在上图中V8内存空间一分为二 From、To作为新生代对象存储区 其则老生代存储区
新生代存储区介绍
- 即存活时间较短的对象(例:局部作用域内的变量执行完需要回收);
- 内存区分为两个等大空间(即:From空间、To空间);
- 在64位操作系统中内存大小位 32MB,32位操作系统中为16MB;
老生代存储区介绍
- 即存活时间较长的对象(例:全局变量、闭包变量数据);
- 在64位操作系统中内存大小位 1.5G,32位操作系统中为700MB;
五、新生代对象回收实现
- 回收过程采用复制算法+标记整理;
- 使用空间为From、空闲空间为To;
- 活动对象存储于From空间;
- 标记整理后将活动对象拷贝至To空间;
- From与To交换空间完成释放;
回收细节说明
- 在拷贝过程中可能出现晋升(即:将新生代对象移至老生代对象);
- 一轮GC后还存活的新生代需要晋升(移至老生代);
- To空间使用率超过25%(From与To进行空间交换时如果不设限会存在空间不足的情况、所以这里限制为25%);
六、老生代对象回收实现
- 主要采用标记清理、标记整理、增量标记算法;
- 首先使用标记清除完成垃圾空间的回收(存在空间碎片化、但回收速度极快);
- 在新生代晋升过程中,老生代空间不足以存放新生代时,则会采用标记整理进行空间优化;(整理碎片化空间);
- 采用增量标记进行效率优化;
七、新老生代回收细节对比
- 新生代区域垃圾回收使用空间换时间(采用复制算法每时每刻有空闲空间存在,即牺牲一定量空间来提升回收速度);
- 老生代区域垃圾回收不适合复制算法(空间较大,一分为二浪费空间,数据量大如果采用复制算法则会消耗许多时间);
八、增量标记如何进行垃圾回收
如图所示:程序执行与垃圾回收交替执行
总结
- V8引擎作为现主流的JavaScript执行引擎;
- 内存设置上限(作为web应用来说足够使用,超过1.5G在回收过程中会增加人体感知。 因为在回收执行时程序时停止运行的);
- V8采用分代回收的思想实现垃圾回收(即分为新生代、老生代储存区);
- V8回收中常见的GC算法 (新生代:复制算法,标记整理。老生代:标记清理,标记整理,增量标记);