關(guān)于V8
V8是一款主流的js執(zhí)行引擎。它是為JS在瀏覽器執(zhí)行而打造的。因此不會(huì)遇到大量使用內(nèi)存的場景。所以它申請的內(nèi)存在64位系統(tǒng)不超過1.5G,32位系統(tǒng)不超過800M
V8中的內(nèi)存管理和垃圾回收
?程序使用過程中會(huì)用到很多數(shù)據(jù),這些數(shù)據(jù)可分為原始數(shù)據(jù)和對象類型數(shù)據(jù),對于原始數(shù)據(jù)都是由語言自身來控制的。所以回收指的是堆區(qū)里面的對象類型數(shù)據(jù)。
V8中采用分代回收的思想,主要講內(nèi)存分為新生代和老生代,針對不同的分代采用不同的GC算法。其中新生代在64位系統(tǒng)下大約是32M,32位系統(tǒng)下約為16M,而老生代在64位系統(tǒng)下約為1400M,32位系統(tǒng)下對半,約為700M。
新生代垃圾回收機(jī)制
新生代指的是存活時(shí)間較短的對象,回收的過程采用了復(fù)制算法+標(biāo)記整理的模式。新生代內(nèi)存被區(qū)分為兩個(gè)等大小的空間,一個(gè)空間是使用的From空間,一個(gè)是空間的To空間。
當(dāng)From空間占滿時(shí)就會(huì)啟動(dòng)新生代的GC算法,開始垃圾回收時(shí)開始檢查From空間內(nèi)的存活對象,并把From中的存活對象復(fù)制給To空間。From空間內(nèi)失活的對象就會(huì)被銷毀。復(fù)制完成后From空間和To空間互換。這里如果To空間的使用率超過了25%,就需要把一輪GC后還存活的新生代代行晉升到老生代。
老生代垃圾回收機(jī)制
老生代中存放著的對象存活時(shí)間較長,且空間龐大,所以不再適合復(fù)制算法。老生代采用的是標(biāo)記清除,標(biāo)記整理,增量標(biāo)記算法。
首先使用標(biāo)記清除算法完成垃圾垃圾空間的回收,再采用標(biāo)記清理進(jìn)行空間優(yōu)化,最后采用增量標(biāo)記進(jìn)行效率優(yōu)化。
采用增量標(biāo)記來優(yōu)化效率主要是因?yàn)樵趫?zhí)行GC時(shí)程序是要暫停運(yùn)行的,要等待GC完成后才繼續(xù)執(zhí)行,完成一輪標(biāo)記清除和整理需要大量時(shí)間。所以需要增量標(biāo)記將原來的一次性標(biāo)記改成分很多步去標(biāo)記,代碼執(zhí)行一會(huì)標(biāo)記會(huì),標(biāo)記和程序執(zhí)行交替執(zhí)行。直到標(biāo)記階段結(jié)束。
新生代與老生代回收機(jī)制對比
- 新生代區(qū)域垃圾回收使用空間換時(shí)間
- 老生代區(qū)域垃圾回收不合適復(fù)制算法