JS中的垃圾回收機(jī)制二--V8的垃圾回收機(jī)制

關(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ù)制算法
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容