前端面試-JS垃圾回收機制

什么是垃圾回收機制?

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)部的
?著作權(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)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,658評論 1 32
  • 1. 概述 由于字符串、對象和數(shù)組沒有固定大小,所有當(dāng)他們的大小已知時,才能對他們進(jìn)行動態(tài)的存儲分配。JavaSc...
    Jony0114閱讀 720評論 0 0
  • 歡迎訪問我的博客https://qqqww.com,祝碼農(nóng)同胞們早日走上人生巔峰,迎娶白富美~~~ Js具有自動垃...
    這里王工頭閱讀 1,048評論 0 1
  • 像C語言這樣的底層語言一般都有底層的內(nèi)存管理接口,比如 malloc()和free()用于分配內(nèi)存和釋放內(nèi)存。 而...
    前端js閱讀 575評論 1 3
  • 什么是垃圾回收機制? 和java,c#一樣,javascript也有垃圾回收的機制,比如說c++和c就沒有垃圾回收...
    我向你奔閱讀 504評論 0 1

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