欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

?;厥?/h2>

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

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

堆回收

堆中變量存儲的分類

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

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

新生代垃圾回收

采用Scavenge算法,簡單來說就是Copy,也叫新生代互換。

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

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

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

老生代垃圾回收

標(biāo)記清除

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

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

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

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

標(biāo)記整理

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

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

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

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

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

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

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

plus

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

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

相關(guān)文章

  • element-ui?el-table表格固定表頭代碼示例

    element-ui?el-table表格固定表頭代碼示例

    Element-UI的el-table組件是一個非常強大的表格組件,它提供了多種常見的表格功能,如排序、篩選、分頁、自定義列模板等,這篇文章主要給大家介紹了關(guān)于element-ui?el-table表格固定表頭的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • Vue路由組件的緩存keep-alive和include屬性的具體使用

    Vue路由組件的緩存keep-alive和include屬性的具體使用

    :瀏覽器頁面在進行切換時,原有的路由組件會被銷毀,通過緩存可以保存被切換的路由組件,本文主要介紹了Vue路由組件的緩存keep-alive和include屬性的具體使用,感興趣的可以了解一下
    2023-11-11
  • vue頁面params傳值的坑及解決

    vue頁面params傳值的坑及解決

    這篇文章主要介紹了vue頁面params傳值的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • vue-router傳參用法詳解

    vue-router傳參用法詳解

    今天小編就為大家分享一篇關(guān)于vue-router傳參用法詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • vue3父子組件傳值?雙向綁定及注意問題小結(jié)

    vue3父子組件傳值?雙向綁定及注意問題小結(jié)

    這篇文章主要介紹了Vue3中如何通過v-model實現(xiàn)父子組件的雙向數(shù)據(jù)綁定及利用computed簡化父子組件雙向綁定,本文結(jié)合示例代碼給大家講解的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • Vue.js進階知識點總結(jié)

    Vue.js進階知識點總結(jié)

    給大家分享了關(guān)于Vue.js想成為高手的5個總要知識點,需要的朋友可以學(xué)習(xí)下。
    2018-04-04
  • VUE配置history路由模式配置詳細舉例

    VUE配置history路由模式配置詳細舉例

    這篇文章主要給大家介紹了關(guān)于VUE配置history路由模式配置的相關(guān)資料,History模式是Vue路由的另一種模式,在History模式下URL中的路徑不再使用#符號,而是直接使用正常的路徑形式,需要的朋友可以參考下
    2023-12-12
  • vue組件間傳值的方法你知道幾種

    vue組件間傳值的方法你知道幾種

    這篇文章主要為大家詳細介紹了vue組件間傳值的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 詳解vue 自定義marquee無縫滾動組件

    詳解vue 自定義marquee無縫滾動組件

    這篇文章主要介紹了vue自定義marquee無縫滾動組件,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 淺談vue-props的default寫不寫有什么區(qū)別

    淺談vue-props的default寫不寫有什么區(qū)別

    這篇文章主要介紹了淺談vue-props的default寫不寫有什么區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08

最新評論