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》