什么是垃圾回收機制?
JS的垃圾回收機制是為了以防內(nèi)存泄漏,內(nèi)存泄漏的含義就是當(dāng)已經(jīng)不需要某塊內(nèi)存時這塊內(nèi)存還存在著,垃圾回收機制就是間歇的不定期的尋找到不再使用的變量,并釋放掉它們所指向的內(nèi)存。
變量的生命周期
當(dāng)一個變量的生命周期結(jié)束之后它所指向的內(nèi)存就應(yīng)該被釋放。JS有兩種變量,全局變量和在函數(shù)中產(chǎn)生的局部變量。局部變量的生命周期在函數(shù)執(zhí)行過后就結(jié)束了,此時便可將它引用的內(nèi)存釋放(即垃圾回收),但全局變量生命周期會持續(xù)到瀏覽器關(guān)閉頁面。
JS垃圾回收方式
JS執(zhí)行環(huán)境中的垃圾回收器怎樣才能檢測哪塊內(nèi)存可以被回收有兩種方式:標(biāo)記清除(mark and sweep)、引用計數(shù)(reference counting)。
標(biāo)記清除(mark and sweep)
大部分瀏覽器以此方式進(jìn)行垃圾回收,當(dāng)變量進(jìn)入執(zhí)行環(huán)境(函數(shù)中聲明變量)的時候,垃圾回收器將其標(biāo)記為“進(jìn)入環(huán)境”,當(dāng)變量離開環(huán)境的時候(函數(shù)執(zhí)行結(jié)束)將其標(biāo)記為“離開環(huán)境”,在離開環(huán)境之后還有的變量則是需要被刪除的變量。標(biāo)記方式不定,可以是某個特殊位的反轉(zhuǎn)或維護(hù)一個列表等。
垃圾收集器給內(nèi)存中的所有變量都加上標(biāo)記,然后去掉環(huán)境中的變量以及被環(huán)境中的變量引用的變量的標(biāo)記。在此之后再被加上的標(biāo)記的變量即為需要回收的變量,因為環(huán)境中的變量已經(jīng)無法訪問到這些變量。
引用計數(shù)(reference counting)
這種方式常常會引起內(nèi)存泄漏,低版本的IE使用這種方式。機制就是跟蹤一個值的引用次數(shù),當(dāng)聲明一個變量并將一個引用類型賦值給該變量時該值引用次數(shù)加1,當(dāng)這個變量指向其他一個時該值的引用次數(shù)便減一。當(dāng)該值引用次數(shù)為0時就會被回收。
什么是‘可達(dá)性’?
簡單地說,“可達(dá)性” 值就是那些以某種方式可訪問或可用的值,它們被保證存儲在內(nèi)存中。
有一組基本的固有可達(dá)值,由于顯而易見的原因無法刪除。例如:
- 本地函數(shù)的局部變量和參數(shù)
- 當(dāng)前嵌套調(diào)用鏈上的其他函數(shù)的變量和參數(shù)
- 全局變量
- 還有一些其他的,內(nèi)部的