最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你搞懂V8垃圾回收系統(tǒng)

 更新時(shí)間:2023年07月28日 08:22:40   作者:榮達(dá)  
在V8中,JavaScript的內(nèi)存空間分為棧(Stack)和堆(Heap)兩部分,垃圾回收的基本思路是:查找內(nèi)存中的所有變量,看哪些已經(jīng)不再需要,然后釋放這些變量所占用的內(nèi)存,本文就給大家梳理一下V8垃圾回收系統(tǒng),需要的朋友可以參考下

內(nèi)存中兩種變量的存儲(chǔ)

在V8中,JavaScript的內(nèi)存空間分為棧(Stack)和堆(Heap)兩部分。棧用于存儲(chǔ)原始類型,如Number,String,Boolean,Null,Undefined,Symbol以及引用對(duì)象的內(nèi)存地址,而堆用于存儲(chǔ)引用類型的對(duì)象。

垃圾回收的基本思路是:查找內(nèi)存中的所有變量,看哪些已經(jīng)不再需要,然后釋放這些變量所占用的內(nèi)存。

所以V8中的垃圾回收可以分為?;厥?/strong>和堆回收。

?;厥?/h2>

在V8引擎中,函數(shù)調(diào)用的參數(shù)、返回地址和局部變量都存儲(chǔ)在調(diào)用棧中。每當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),都會(huì)創(chuàng)建一個(gè)新的棧幀,其中包含這些信息。而棧幀的回收則非常直接:一旦函數(shù)調(diào)用結(jié)束,其棧幀就會(huì)被立即移除。這種機(jī)制依賴于ESP(Extended Stack Pointer)指針,該指針始終指向棧的頂部,用于追蹤哪些棧幀是活動(dòng)的,哪些可以被安全回收。

簡(jiǎn)單理解:說(shuō)白了就是某個(gè)作用域代碼執(zhí)行完畢后,自動(dòng)回收作用域內(nèi)所有的普通數(shù)據(jù)類型的垃圾。

堆回收

堆中變量存儲(chǔ)的分類

V8引擎引入所謂的“代際假說(shuō)”,即“大部分對(duì)象在內(nèi)存中存在的時(shí)間很短”,所以把堆內(nèi)存分為新生代老生代兩部分,新生代即對(duì)象一開(kāi)始創(chuàng)建時(shí)存放的區(qū)域,一旦對(duì)象滿足了一定的條件(也就是V8認(rèn)為其會(huì)長(zhǎng)時(shí)間存在于內(nèi)存),那么它就會(huì)被移動(dòng)(“晉升”)至老生代。

所以針對(duì)堆內(nèi)存中的垃圾回收,也分為兩種算法來(lái)分別處理新老生代。

新生代垃圾回收

采用Scavenge算法,簡(jiǎn)單來(lái)說(shuō)就是Copy,也叫新生代互換。

結(jié)合上圖:新生代空間等分成From空間與To空間,新聲明的變量存放到新生代的From空間,直到From空間滿了,這時(shí)候需要進(jìn)行GC的垃圾回收。GC會(huì)根據(jù)代碼分析出哪些obj不是垃圾,然后把非垃圾的obj對(duì)象直接copy到To空間,最后把From空間中的垃圾進(jìn)行刪除即可,至此存放對(duì)象的To空間變成From空間,原本的From空間變成To空間,從而開(kāi)啟新一輪的對(duì)象存儲(chǔ)。

之所以新生代采用這種回收算法,可以從時(shí)空復(fù)雜度進(jìn)行分析,首先我們會(huì)發(fā)現(xiàn)新生代的空間在同一時(shí)刻只有一半被利用,把空間進(jìn)行了折半,目的就是為了對(duì)象轉(zhuǎn)移時(shí)直接進(jìn)行copy操作(肯定耗時(shí)非常低),可以理解為空間換時(shí)間。

并且新生代的總空間相較于老生代比較小,所以折半空間不會(huì)損失太多的內(nèi)存空間,可以接受。

老生代垃圾回收

標(biāo)記清除

在V8引擎早期,采用的是Mark-Sweep算法(標(biāo)記清除),如下圖:

注:上面圖示的GC根節(jié)點(diǎn)并不是指瀏覽器的window對(duì)象,但可以類比window對(duì)象,我們可以通過(guò)window.xxx.xxx.xx訪問(wèn)所有的變量,自然可以通過(guò)GC的根節(jié)點(diǎn)訪問(wèn)所有的內(nèi)存對(duì)象,一旦GC斷開(kāi)了與某個(gè)對(duì)象的聯(lián)系,那么這個(gè)對(duì)象就可以理解為垃圾。

標(biāo)記清除算法的完整步驟:

  • 從GC的根節(jié)點(diǎn)開(kāi)始進(jìn)行“廣度掃描”(專屬術(shù)語(yǔ))并把非垃圾進(jìn)行標(biāo)記
  • 清除未被標(biāo)記的對(duì)象

標(biāo)記整理

現(xiàn)階段Mark-Compact算法(標(biāo)記整理)已經(jīng)成為主流,如下圖:

標(biāo)記整理算法步驟:

  • 先進(jìn)行廣度掃描并標(biāo)記非垃圾變量
  • 整理非垃圾變量的位置,目的是獲取更大的連續(xù)空間,如上圖一到圖二(整理的過(guò)程中會(huì)對(duì)一些垃圾進(jìn)行覆蓋,可以理解為先整理后清除的原因)
  • 垃圾清除

也就是相較于標(biāo)記清除算法多了一步:在垃圾清除之前進(jìn)行內(nèi)存空間的整理

標(biāo)記算法優(yōu)化

如上我們所描述的標(biāo)記,都是“全停頓標(biāo)記”,也就是說(shuō)js主線程切換至GC垃圾回收線程時(shí),在GC線程中會(huì)把所有的應(yīng)該標(biāo)記的變量都進(jìn)行標(biāo)記,然后進(jìn)行大規(guī)模的清除。

這種標(biāo)記算法的劣勢(shì)就是時(shí)間開(kāi)銷大,導(dǎo)致GC線程占用的時(shí)間長(zhǎng),阻塞js主線程的運(yùn)行。所以后期標(biāo)記算法也進(jìn)行了優(yōu)化,衍生出來(lái)增量標(biāo)記與三色標(biāo)記法,這里就不詳細(xì)記錄了,總之優(yōu)化的核心思想就是部分標(biāo)記,從而減少GC線程對(duì)js線程運(yùn)行時(shí)間的搶占。

plus

當(dāng)然更早期的IE瀏覽器還使用過(guò)引用計(jì)數(shù)的堆回收算法,存在著不能解決循環(huán)引用問(wèn)題等痛點(diǎn)。這里不再贅述。

到此這篇關(guān)于一文搞懂V8垃圾回收系統(tǒng)的文章就介紹到這了,更多相關(guān)V8垃圾回收系統(tǒng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue中使用vux配置代碼詳解

    Vue中使用vux配置代碼詳解

    這篇文章主要介紹了Vue中使用vux配置代碼詳解,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-09-09
  • vue使用swiper.js重疊輪播組建樣式

    vue使用swiper.js重疊輪播組建樣式

    這篇文章主要為大家詳細(xì)介紹了vue使用swiper.js重疊輪播組建樣式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • vuex通過(guò)getters訪問(wèn)數(shù)據(jù)為undefined問(wèn)題及解決

    vuex通過(guò)getters訪問(wèn)數(shù)據(jù)為undefined問(wèn)題及解決

    這篇文章主要介紹了vuex通過(guò)getters訪問(wèn)數(shù)據(jù)為undefined問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 使用vue 國(guó)際化i18n 實(shí)現(xiàn)多實(shí)現(xiàn)語(yǔ)言切換功能

    使用vue 國(guó)際化i18n 實(shí)現(xiàn)多實(shí)現(xiàn)語(yǔ)言切換功能

    這篇文章主要介紹了使用vue 國(guó)際化i18n 多實(shí)現(xiàn)語(yǔ)言切換功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2018-10-10
  • 淺談vue的第一個(gè)commit分析

    淺談vue的第一個(gè)commit分析

    這篇文章主要介紹了淺談vue的第一個(gè)commit分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • v-for中動(dòng)態(tài)校驗(yàn)el-form表單項(xiàng)的實(shí)踐

    v-for中動(dòng)態(tài)校驗(yàn)el-form表單項(xiàng)的實(shí)踐

    在項(xiàng)目開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到表單保存的功能,本文主要介紹了v-for中動(dòng)態(tài)校驗(yàn)el-form表單項(xiàng)的實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2022-05-05
  • vue3項(xiàng)目中使用three.js的操作步驟

    vue3項(xiàng)目中使用three.js的操作步驟

    最近在學(xué)習(xí)Three.js相關(guān)的技術(shù),恰逢Vue 3.0正式版也已推出,下面這篇文章主要給大家介紹了關(guān)于vue3項(xiàng)目中使用three.js的操作步驟,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • vue 獲取url參數(shù)、get參數(shù)返回?cái)?shù)組的操作

    vue 獲取url參數(shù)、get參數(shù)返回?cái)?shù)組的操作

    這篇文章主要介紹了vue 獲取url參數(shù)、get參數(shù)返回?cái)?shù)組的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • VUE使用DXFParser組件解析dxf文件生成圖片的操作代碼

    VUE使用DXFParser組件解析dxf文件生成圖片的操作代碼

    這篇文章主要介紹了VUE使用DXFParser組件解析dxf文件生成圖片的操作代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • el-checkbox-group?的v-model無(wú)法綁定對(duì)象數(shù)組的問(wèn)題解決

    el-checkbox-group?的v-model無(wú)法綁定對(duì)象數(shù)組的問(wèn)題解決

    elementUI官方文檔中el-checkbox-group組件綁定的都為一維數(shù)組,本文主要介紹了解決el-checkbox-group?的v-model無(wú)法綁定對(duì)象數(shù)組,感興趣的可以了解一下
    2023-05-05

最新評(píng)論

汶上县| 读书| 德保县| 怀安县| 栾城县| 孟州市| 柳江县| 涞源县| 苍山县| 青田县| 宜州市| 阳信县| 客服| 政和县| 新化县| 通辽市| 成武县| 青铜峡市| 贞丰县| 贵定县| 遂昌县| 工布江达县| 大姚县| 莱西市| 久治县| 土默特左旗| 松潘县| 台东县| 平阳县| 建始县| 蒙城县| 泰顺县| 长治县| 安康市| 云林县| 台湾省| 阿合奇县| 星子县| 江城| 梓潼县| 邯郸县|