v8的垃圾回收机制

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》

相关文章
相关标签/搜索