V8引擎
它是JS执行引擎,即时编译,内存设限。
V8垃圾回收策略
回收的是储存在内存中堆里面的复杂数据(object array)
V8中常用的GC算法:
分代回收
空间复制
标记清除
标记整理
标记增量
V8内存分配
如图所示:
V8内存空间一分为二
小空间用于存储新生代对象(64位:32M 32位:16M)
新生代对象指的是存活时间较短的对象(例如局部作用域中的变量)
新生代对象回收实现
回收过程采用复制算法&标记整理
新生代的内存区分为两个等大小的空间
上图中From是使用空间,To是空闲空间
活动对象会存储于From空间
标记整理后将活动对象拷贝至To空闲空间
From与To交换空间完成释放
回收细节说明
在拷贝的过程中可能出现晋升,晋升就是将新生代对象移动至老生代对象,经过一轮GC之后仍然存活的新生代会晋升,To空间的使用率超过25%
老生代对象回收实现
老生代对象介绍
存储老生代对象空间的大小限制在64位操作系统是1.4G,32位操作系统是700M。
老生代对象指的是存活时间较长的对象(例如:全局作用域中的对象、闭包缓存的变量)
回收实现
主要采用标记清除、标记整理、增量标记算法。
首先采用的是标记清除完成垃圾空间的回收。
当新生代对象移动至老生代对象存储空间,但是老生代对象存储空间不足以盛放即将要移动过来的新生代对象的时候,会触发标记整理来消除第一步标记清除带来的空间碎片化问题。
最后采用增量标记进行效率的优化。
新生代区域的垃圾回收使用空间换时间。
老生代存储区域垃圾回收不适合复制算法。
标记增量优化垃圾回收
标记增量就是将一个完整的标记过程分成几段来完成标记。因为标记会阻碍Js代码的执行,这样做就可以让标记与js代码的执行进行交替完成。