v8是Google推出的JS引擎,他不只提高了Chrome的性能,也为node提供了很好的支持,本篇博文帮助你们大体了解一下v8其中的垃圾回收机制。node
1、内存限制算法
v8限制用户只能使用部份内存(固然,这个限制大小也能够用户本身设置,默认64位约为1.4GB,32位约为0.7GB)性能
缘由:以1.5GB的垃圾回收堆内存为例,v8作一次小的垃圾回收须要50ms以上,作一次非增量式的垃圾回收甚至要1秒以上。spa
在这样子时间开销下,性能和响应能力直线降低。3d
2、分代式垃圾回收机制对象
出现缘由:在自动垃圾回收的演变过程当中,没有固定一种回收算法能胜任全部场景,采起分代式,能够对不一样的代进行不能的处理,以提升效率。blog
堆上: 生命周期
新生代空间:存放存活时间短的对象内存
老生代空间:存放存活时间长的对象v8
一、新生代算法: 主要采用Scavenge算法
过程:
先在新生代区,将堆内存对半分,一半处于使用(即From区),另外一半处于闲置(即To区),平时在From区进行操做。到了要回收的时候,检测From区的对象,存活的对象复制到To
区,而后From区被释放了,以后对To区和From区调换名字,继续重复以前操做
缺点:只能使用一半空间,耗空间
优势:只须要复制少部分存活的对象,由于生命周期短的对象中存活的比较少,节省时间
注意:当一个对象被复制屡次依然存活,则被晋升到老生代,进行管理
(晋升条件:经历过Scavenge算法或To区使用超出25%)
二、老生代算法: 标记清除算法 搭配 标记整理算法
过程:
标记清除算法,先将存活的对象进行标记,清除时只清除没有标记的(老生代中都是生命周期长的对象,恰好死亡的对象少),不过此时会出现内存不连续的状况。可是,若是此时须要放一个大对象,则放不下,从而致使再次引发回收。然而此次回收是没必要要的。
标记整理算法,先将死亡的对象进行标记,而后将存活得对象往一段移动,移动完成后,清理掉边界外的内存。
总结:
能够看出标记整理相对较慢,V8主要仍是使用标记清除,只有在新生代发生晋升,致使老生代分配不出足够空间时,采用标记整理
三、增量标记
上述三种方式局限:都须要将应用暂停下来,等待执行回收,回收执行完毕才继续应用逻辑。特别是v8老生代,由于配置较大,存活的对象多,致使标记、清除、整理带来的停顿更加严重。
增量标记能够将上述步骤拆成更细的“粒度”,让回收中的标记阶段和应用逻辑交替进行,v8引入这个方式后最大停顿减小到本来1/6
四、延迟清除、增量式整理
将清除阶段和整理阶段也进行了“增量式改造”
备注:摘取《深刻浅出nodejs》