淺談 JS 垃圾回收機制

1. 代碼中什么是垃圾呢?

不再需要-----就是垃圾

var  a = 1    // a 是不是垃圾呢? 
...
console.log(a)   // a 后面被使用,則不是垃圾
所有的全局變量都不會被垃圾回收

因為任何時候都有可能用到

window
    ---
        |
        object
        |
        Array
        |
        Promise
        ......    // 全局自定義變量
變量都有生命周期
function test(){
    var b = 2
    console.log(b)
} // 變量b只在函數(shù)內(nèi)生效  每次運行函數(shù)都會產(chǎn)生一個新的變量b

當(dāng)我們聲明一個對象(或者說復(fù)雜數(shù)據(jù)類型)

單引用:

var a = {
    name:'xiaoou'
}
// a 指向一塊內(nèi)存地址  當(dāng)我把 a = null 時,相當(dāng)于 a 沒指向任何地址空間
// 這塊內(nèi)存就無法被訪問到   就會被回收掉

雙重引用:

var a = {
    name:'xiaoou'
}
var admin = a 
a = null
//  這時有兩個變量引用此地址 有一個指向null 另一個還是引用著內(nèi)存地址 則不會被回收

環(huán)引用:

function marry(man,woman){
    woman.husband = man
    man.wife = woman
    return {
        father:man,
        mother:woman
    }
}
let family = marry({
    name:'john'
},{
    name;'Ann'
})
環(huán)引用.png

在環(huán)引用中,要想回收一個對象,只需要刪除所有別人對于他的引用即可

delete family.father
delete family.mother.husband
循環(huán)引用刪除.png

環(huán)引用中切斷與外界聯(lián)系可以直接被垃圾回收

family = null
刪除外界環(huán)引用.png
對象的回收總結(jié):
  1. 全局對象不會被回收
  2. 局部中一個對象不被任何變量引用則會被回收
  3. 環(huán)引用中,整體不被引用則環(huán)被回收

2. 垃圾的回收算法

標記清除

從全局變量開始,遍歷每個全局變量,把引用到的變量標記為被引用,然后依次遍歷被標記的變量重復(fù)上述步驟,知道最后的變量沒有引用其他變量為止,未被標記的變量則會被回收

垃圾回收之標清除.png

缺點:變量過多的情況下會比較消耗性能,而且導(dǎo)致JS主線程執(zhí)行停止

引用計數(shù)
  1. 首先把全局變量記為1
  2. 其余變量按被引用的次數(shù)記數(shù)
  3. 某個變量設(shè)置為null時,被引用的變量次數(shù)減一
  4. 直到某個變量的被引用次數(shù)為 0 則會被回收掉
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文目錄 1.JS引擎的內(nèi)存 2.新生代和老生代的內(nèi)存回收 3.可達性 4.兩個引用的情況 5.相互關(guān)聯(lián)的對象 6...
    前端輝羽閱讀 448評論 0 5
  • 一、垃圾回收簡述 JS 是使用垃圾回收的語言,簡單來說就是執(zhí)行環(huán)境負責(zé)在代碼執(zhí)行時管理內(nèi)存。基本思路很簡單:確定哪...
    前端_Fn閱讀 699評論 0 0
  • 一、什么是閉包? 如果這個函數(shù)能夠訪問其他函數(shù)作用域中的變量,那么這個函數(shù)就叫做閉包。 換句話說,只要在一個函數(shù)中...
    Adonia汪閱讀 2,324評論 0 3
  • 為了保證的可讀性,本文采用意譯而非直譯。 最近看到一些面試的回顧,不少有被面試官問到談?wù)凧S 垃圾回收機制,說實話...
    歐巴桑桑閱讀 260評論 0 0
  • 1. 概述 由于字符串、對象和數(shù)組沒有固定大小,所有當(dāng)他們的大小已知時,才能對他們進行動態(tài)的存儲分配。JavaSc...
    Jony0114閱讀 720評論 0 0

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