V8引擎新老生代回收机制及对比

一.什么是V8引擎

目前最主流的JavaScript执行引擎,V8采用即时编译,内存设限极大增加了运行速度,垃圾回收策略采用分代回收的思想

内存分为新生代回收机制,老生代回收机制,针对不同的对象采用不同的算法,如下图所示:

二.V8中常用的GC算法

分代回收 空间复制 标记清除 标记整理 标记增量

1.V8的内存分配

如上图所示,V8内存空间一分为二,左侧白色背景部分用于存放新生代对象  新生代指的是存活时间较短的对象

1-1新生代对象回收实现

回收过程采用复制算法+标记整理,新生代内存区分为两个等大小的空间,使用空间为From,空闲空间为To,活动对象存储于From空

间,标记整理后将活动对象拷贝至To,From与To交换空间完成释放。

1-2回收细节说明

拷贝过程中可能出现晋升,(晋升就是将新生代对象移动至老生代),出现晋升的情况有两种

1.一轮GC还存活的新生代需要晋升

2.To空间的使用率超过25%

1-2老年代对象回收实现

老年代对象存放在右侧老年代区域 老年代对象指存活时间较长的对象 其中包括闭包的里面的一些变量和一些全局变量。主要采用标记

清除,标记整理 增量标记算法。首先使用标记清除完成垃圾空间的回收,采用标记整理进行空间优化,采用增量标记进行效率优化。

1-3新老生代回收对比

新生代区域垃圾回收使用是空间换时间

老生代区域垃圾回收不适合复制算法(因为老生代区域比较大,一分为二浪费比较大,复制算法比较浪费时间)

增量标记优化垃圾回收 程序执行与垃圾回收交替执行

---感谢阅读,o(* ̄︶ ̄*)o开心每一天!
原文地址:https://www.cnblogs.com/websiteblogs/p/14289960.html