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é):
- 全局對象不會被回收
- 局部中一個對象不被任何變量引用則會被回收
- 環(huán)引用中,整體不被引用則環(huán)被回收
2. 垃圾的回收算法
標記清除
從全局變量開始,遍歷每個全局變量,把引用到的變量標記為被引用,然后依次遍歷被標記的變量重復(fù)上述步驟,知道最后的變量沒有引用其他變量為止,未被標記的變量則會被回收

垃圾回收之標清除.png
缺點:變量過多的情況下會比較消耗性能,而且導(dǎo)致JS主線程執(zhí)行停止
引用計數(shù)
- 首先把全局變量記為1
- 其余變量按被引用的次數(shù)記數(shù)
- 某個變量設(shè)置為null時,被引用的變量次數(shù)減一
- 直到某個變量的被引用次數(shù)為 0 則會被回收掉