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新老生代回收对比
新生代区域垃圾回收使用是空间换时间
老生代区域垃圾回收不适合复制算法(因为老生代区域比较大,一分为二浪费比较大,复制算法比较浪费时间)
增量标记优化垃圾回收 程序执行与垃圾回收交替执行
posted on 2021-01-17 20:00 メSerendipity 阅读(531) 评论(0) 编辑 收藏 举报