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》

相關文章
相關標籤/搜索