丨垃圾回收一v8的兩個器是如何工作_第1頁
丨垃圾回收一v8的兩個器是如何工作_第2頁
丨垃圾回收一v8的兩個器是如何工作_第3頁
丨垃圾回收一v8的兩個器是如何工作_第4頁
丨垃圾回收一v8的兩個器是如何工作_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

首先,我們看看數(shù)據(jù)是怎么產(chǎn)生的比如下面這樣一句代碼window.test=newwindow.test.a=new當(dāng)JavaScript執(zhí)行這段代碼的時候,會先為window對象添加一個test屬性,并在堆中創(chuàng)建了一個空對象,并將該對象的地址指向了window.test屬性。隨后又創(chuàng)建一個大小為100的數(shù)組,并將屬性地址指向了test.a的屬性值。此時的內(nèi)存布局圖如下所示:我們可以看到,棧中保存了指向window對象的指針,通過棧中window的地址,我們可以到達(dá)window對象,通過window對象可以到達(dá)test對象,通過test對象還可以到達(dá)a對象。如果此時,我將另外一個對象賦給了a屬性,代碼如下所示1window.test.a=new那么此時的內(nèi)存布局如下所我們可以看到,a屬性之前是指向堆中數(shù)組對象的,現(xiàn)在已經(jīng)指向了另外一個空對象,那么此時堆中的數(shù)組對象就成為了數(shù)據(jù),因?yàn)槲覀儫o法從一個根對象遍歷到這個Array對不過,你不用擔(dān)心這個數(shù)組對象會一直占用內(nèi)存空間,因?yàn)閂8虛擬機(jī)中的回收器會幫第一步,通過GCRoot標(biāo)記空間中活動對象和非活動對象目前V8采用的可性(reachability)算法來判斷堆中的對象是否是活動對象。具體地講,這個算法是將一些GCRoot作為初始存活的對象的集合,從GCRoots對象出發(fā),遍歷GCRoot中的所有對象:通過GCRoot遍歷到的對象,我們就認(rèn)為該對象是可的(reachable),那么必須通過GCRoots沒有遍歷到的對象,則是不可的(unreachable),那么這些不可在瀏覽器環(huán)境中,GCRoot有很多,通常包括了以下幾種是不止于這幾種):全局的window對象(位于每個iframe中);文檔DOM,由可以通過遍歷文檔到達(dá)的所有原生DOM點(diǎn)組成;以上就是大致的回收的流程。目前V8采用了兩個回收器,主回收器-MajorGC和副回收器-MinorGC(Scavenger)。V8之所以使用了兩個回收器,主要是受到了代際假說(TheGenerationalHypothesis)的影響。代際假說是回收領(lǐng)域中一個重要的術(shù)語,它有以下兩個特點(diǎn)第一個是大部分對象都是“朝生夕死”的,也就是說大部分對象在內(nèi)存中存活的時間很短,比如函數(shù)內(nèi)部的變量,或者塊級作用域中的變量,當(dāng)函數(shù)或者代碼塊執(zhí)行結(jié)束時,作用域中定義的變量就會被銷毀。因此這一類對象一經(jīng)分配內(nèi)存,很快就變得不可;第二個是不死的對象,會活得更久,比如全局的window、DOM、WebAPI等對象。其實(shí)這兩個特點(diǎn)不僅僅適用于JavaScript,同樣適用于大多數(shù)的動態(tài)語言,如Java、Python等。V8的回收策略,就是建立在該假說的基礎(chǔ)之上的。接下來,我們來分析下V8是如何如果我們只使用一個回收器,在優(yōu)化大多數(shù)新對象的同時,就很難優(yōu)化到那些老對象,因此你需衡各種場景,根據(jù)對象生存周期的不同,而使用不同的算法,以便達(dá)到最好的所以,在V8中,會把堆分為和老生代兩個區(qū)域,中存放的是生存時間短的對通常只支持1~8M的容量,而老生代支持的容量就大很多了。對于這兩塊區(qū)V8分別使用兩個不同的回收器,以便更高效地實(shí)施回收副回收器-MinorGC(Scavenger),主要負(fù)責(zé)的回收。主回收器-MajorGC,主要負(fù)責(zé)老生代的回收。中的數(shù)據(jù)用Scavenge算法來處理。所謂Scavenge算法,是把空間對半劃分為兩個區(qū)域,一半是對象區(qū)域(from-space),一半是空閑區(qū)域(to-space),如下新加入的對象都會存放到對象區(qū)域,當(dāng)對象區(qū)域快被寫滿時,就需要執(zhí)行一次清理作在回收過程中,首先要對對象區(qū)域中的做標(biāo)記;標(biāo)記完成之后,就進(jìn)入清理階段。副回收器會把這些存活的對象到空閑區(qū)域中,同時它還會把這些對象排列起來,所以這個過程,也就相當(dāng)于完成了內(nèi)存整理操作,后空閑區(qū)域就沒有內(nèi)存完成后,對象區(qū)域與空閑區(qū)域進(jìn)行角色翻轉(zhuǎn),也就是原來的對象區(qū)域變成空閑區(qū)域,原來的空閑區(qū)域變成了對象區(qū)域。這樣就完成了對象的回收操作,同時,這種角色翻轉(zhuǎn)的不過,副回收器每次執(zhí)行清理操作時,都需要將存活的對象從對象區(qū)域到空閑區(qū)域,操作需要時間成本,如果新生區(qū)空間設(shè)置得太大了,那么每次清理的時間就會過對象裝滿了,便執(zhí)行回收。同時,副回收器還會采用對象晉升策略,也就是移由于老生代的對象比較大,若要在老生代中使用Scavenge算法進(jìn)行回收,這些所以,主回收器是采用標(biāo)記-清除(Mark-Sweep)的算法進(jìn)行回收的。那么,標(biāo)記-清除算法是如何工作的對數(shù)據(jù)進(jìn)行標(biāo)記,然后清除,這就是標(biāo)記-清除算法,不過對一塊內(nèi)存多次執(zhí)行標(biāo)記-清除算法后,會產(chǎn)生大量不連續(xù)的內(nèi)存碎片。而碎片過多會導(dǎo)致大對象無法分配到足夠的連續(xù)內(nèi)存,于是又引入了另外一種算法——標(biāo)記-整理( pact)。這個算法的標(biāo)記過程仍然與標(biāo)記-清除算法里的是一樣的,先標(biāo)記可回收對象,但后續(xù)步今天,我們先分析了什么是數(shù)據(jù),從“GCRoots”對象出發(fā),遍歷GCRoot中的所有對象,如果通過GCRoots沒有遍歷到的對象,則這些對象便是數(shù)據(jù)。V8會有專門V8依據(jù)代際假說,將堆內(nèi)存劃分為和老生代兩個區(qū)域,中存放的是生存時間短的對象,老生代中存放生存時間久的對象。為了提升回收的效率,V8設(shè)置了兩個垃圾回收器,主回收器和副回收器。主回收器負(fù)責(zé)收集老生代中的數(shù)據(jù),副副回收器采用了Scavenge算法,是把空間對半劃分為兩個區(qū)域,一半是對象觀察下面這段代碼functionstrToArray(str)leti=function{leti=letstr='testV8GC'while(i++<1e5){}}}constlen=letarr=newUint16Array(str.length)for(;i<len;++i){arr[i]=}return3456789課后請你想,V8執(zhí)行這段代function{leti=letstr='testV8GC'while(i++<1e5){}}}constlen=letarr=newUint16Array(str.length)for(;i<len;++i){arr[i]=}return3456789感謝你的閱讀,如果你覺得這一講的內(nèi)容對你有所啟發(fā),也歡迎把它給你的朋友 歸科技所有 不得售賣。頁面已增加防盜追蹤,將依 上一 下一 21|回收(二):V8是如何優(yōu)化回收器執(zhí)行效率的言精選留言言-node- 展2strToArrayletarrnewUint16Array(str.lengt然后每次調(diào)用strToArray函數(shù)的時候傳遞進(jìn)去就可以了展1麻煩老師能不能講講Scavenge pact算法的不同點(diǎn)ヾ不好意思問個node的問題。今天被一個nodejs問題搞暈了,引入一個模塊,這個模塊a里有一個屬性c:C3其中C3是個class,判斷C3是不是C1繼承來的,用的是totypeinstanceofC1C1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論