v8 GC機制

1.爲何要分代

V8是Chrome瀏覽器的javascript解釋器,爲何須要把堆分代?不分代不能完成他所作的事情麼?其實不分代徹底能夠,分代的惟一理由就是優化GC性能。你先想一想,若是沒有分代,那咱們全部的對象都在一塊,GC的時候咱們要找到哪些對象沒用,這樣就會對堆的全部區域進行掃描。而咱們的不少對象都是朝生夕死的,若是分代的話,咱們把新建立的對象放到某一地方,當GC的時候先把這塊存「朝生夕死」對象的區域進行回收,這樣就會騰出很大的空間出來。javascript

 

2.怎麼分代

首先堆內存分爲新生代和老生代。新生代又分爲了三部分:1個Eden區和2個Survivor區(分別叫from和to)。默認比例爲8:1:1。java

 

2.爲何要設置Survivor區

Survivor的存在乎義,就是減小被送到老年代的對象,進而減小Full GC的發生,Survivor的預篩選保證,只有經歷16次Minor GC還能在新生代中存活的對象,纔會被送到老年代。算法

 

3.爲何要設置兩個Survivor區

  • Minor GC 會清理年輕代的內存。
  • Major GC 是清理老年代。
  • Full GC 是清理整個堆空間—包括年輕代和老年代。

爲何一個Survivor區不行?第一部分中,咱們知道了必須設置Survivor區。假設如今只有一個survivor區,咱們來模擬一下流程: 
剛剛新建的對象在Eden中,一旦Eden滿了,觸發一次Minor GC,Eden中的存活對象就會被移動到Survivor區。這樣繼續循環下去,下一次Eden滿了的時候,問題來了,此時進行Minor GC,Eden和Survivor各有一些存活對象,若是此時把Eden區的存活對象硬放到Survivor區,很明顯這兩部分對象所佔有的內存是不連續的,也就致使了內存碎片化。 瀏覽器

一個Survivor區帶來碎片化

那麼,瓜熟蒂落的,應該創建兩塊Survivor區,剛剛新建的對象在Eden中,經歷一次Minor GC,Eden中的存活對象就會被移動到第一塊survivor space S0,Eden被清空;等Eden區再滿了,就再觸發一次Minor GC,Eden和S0中的存活對象又會被複制送入第二塊survivor space S1(這個過程很是重要,由於這種複製算法保證了S1中來自S0和Eden兩部分的存活對象佔用連續的內存空間,避免了碎片化的發生)。S0和Eden被清空,而後下一輪S0與S1交換角色,如此循環往復。若是對象的複製次數達到16次,該對象就會被送到老年代中。性能

兩塊Survivor避免碎片化 
上述機制最大的好處就是,整個過程當中,永遠有一個survivor space是空的,另外一個非空的survivor space無碎片優化

那麼,Survivor爲何不分更多塊呢?比方說分紅三個、四個、五個?顯然,若是Survivor區再細分下去,每一塊的空間就會比較小,很容易致使Survivor區滿,所以,我認爲兩塊Survivor區是通過權衡以後的最佳方案。spa

 

4.怎麼GC

通常狀況下,新建立的對象都會被分配到Eden區(一些大對象特殊處理),這些對象通過第一次Minor GC後,若是仍然存活,將會被移到Survivor區。對象

對象在Survivor區中每熬過一次Minor GC,年齡就會增長1歲,當它的年齡增長到必定程度時,就會被移動到年老代中。blog

由於年輕代中的對象基本都是朝生夕死的(80%以上),因此在年輕代的垃圾回收算法使用的是複製算法,複製算法的基本思想就是將內存分爲兩塊,每次只用其中一塊,當這一塊內存用完,就將還活着的對象複製到另一塊上面。複製算法不會產生內存碎片。圖片

在GC開始的時候,對象只會存在於Eden區和名爲「From」的Survivor區,Survivor區「To」是空的。緊接着進行GC,Eden區中全部存活的對象都會被複制到「To」,而在「From」區中,仍存活的對象會根據他們的年齡值來決定去向。年齡達到必定值(年齡閾值,能夠經過-XX:MaxTenuringThreshold來設置)的對象會被移動到年老代中,沒有達到閾值的對象會被複制到「To」區域。通過此次GC後,Eden區和From區已經被清空。這個時候,「From」和「To」會交換他們的角色,也就是新的「To」就是上次GC前的「From」,新的「From」就是上次GC前的「To」。無論怎樣,都會保證名爲To的Survivor區域是空的。Minor GC會一直重複這樣的過程,直到「To」區被填滿,「To」區被填滿以後,會將全部對象移動到年老代中。

young_gc

爲了確保js的正常執行,gc和js執行不能並行執行,所以選擇了相似於共享CPU時間片的執行方式,將gc 和js交替執行。

這裏寫圖片描述

相關文章
相關標籤/搜索