引出我們的主角
我們先來(lái)回憶一下,全局變量,系統(tǒng)會(huì)在頁(yè)面關(guān)閉時(shí)進(jìn)行釋放占用的內(nèi)存,函數(shù)局部變量,會(huì)在函數(shù)執(zhí)行完畢時(shí)進(jìn)行釋放內(nèi)存,這就是今天我們的主角:Js的垃圾回收機(jī)制。
所有的語(yǔ)言,都需要處理這個(gè)過(guò)程,比如C語(yǔ)言,需要開發(fā)者進(jìn)行手動(dòng),申請(qǐng)與釋放內(nèi)存
而 Javascript 自動(dòng)幫我們做了內(nèi)存管理,完成了整個(gè)內(nèi)存管理生命周期,讓開發(fā)者專注于業(yè)務(wù)邏輯本身
但同時(shí)也給開發(fā)者造成了——可以不關(guān)心內(nèi)存管理的假象。
總結(jié)一下這個(gè)過(guò)程:
· 分配你所需要的內(nèi)存
· 使用分配到的內(nèi)存(讀、寫)
· 不需要時(shí)將其釋放\歸還
下面說(shuō)一下垃圾回收兩個(gè)重要的點(diǎn):
· 內(nèi)存泄漏
當(dāng)一些不再被需要的內(nèi)存,由于某種原因,無(wú)法被釋放。就會(huì)造成內(nèi)存泄漏,導(dǎo)致程序內(nèi)存被占用,直至崩潰。
· 可達(dá)性
垃圾回收的標(biāo)準(zhǔn)就是對(duì)象是否可達(dá),變量是否能被引用
引用
對(duì)象{ name: xxx }的內(nèi)存地址,被a,b兩個(gè)變量引用兩次,當(dāng)a被賦值為null,因?yàn)閎還在引用,可達(dá),所以沒有被回收
當(dāng)test1()被執(zhí)行,系統(tǒng)為obj分配內(nèi)存,當(dāng)函數(shù)執(zhí)行完畢,內(nèi)存被回收。
當(dāng)test2()被執(zhí)行obj也開辟了內(nèi)存,但obj被返回結(jié)果 賦值給了b,成為了全局變量,不會(huì)被銷毀
介紹一下垃圾回收實(shí)現(xiàn)的兩種常用的方法:
1、引用清除(IE9之前采用)
變量聲明以后被引用的次數(shù),為 0 時(shí),該變量?jī)?nèi)存被銷毀
優(yōu)點(diǎn)
· 即刻回收垃圾,當(dāng)被引用數(shù)值為0時(shí),就會(huì)立刻被回收
· 不用去遍歷堆里面的所有活動(dòng)對(duì)象和非活動(dòng)對(duì)象
缺點(diǎn)
· 計(jì)數(shù)器需要占很大的位置,因?yàn)椴荒茴A(yù)估被引用的上限
· 最大的劣勢(shì)是無(wú)法解決循環(huán)引用無(wú)法回收的問(wèn)題
上面a,b互相引用,計(jì)數(shù)不會(huì)等于0,內(nèi)存不會(huì)回收,重復(fù)調(diào)用,會(huì)占用大量?jī)?nèi)存
2、V8引擎里面 (現(xiàn)在基本采用,標(biāo)記清除)
是瀏覽器中Javascript解析引擎V8采用,標(biāo)記階段:把所有活動(dòng)對(duì)象做上標(biāo)記,把沒有標(biāo)記(也就是非活動(dòng)對(duì)象)銷毀,
從全局作用域的變量,沿作用域逐層往里深度遍歷,當(dāng)發(fā)現(xiàn)被引用,打上標(biāo)記,執(zhí)行完畢,將沒有被標(biāo)記的變量?jī)?nèi)存,進(jìn)行銷毀
說(shuō)一說(shuō)常見的內(nèi)存泄漏
Foo 被調(diào)用時(shí), this 指向全局變量(window),相當(dāng)于與是全局變量,變量不會(huì)被回收
當(dāng)節(jié)點(diǎn)被干掉,定時(shí)器還是會(huì)不停執(zhí)行
閉包
計(jì)數(shù)器
既實(shí)現(xiàn)遞增,又不污染全局環(huán)境, 子函數(shù)引用父函數(shù)變量num,父函數(shù)執(zhí)行完畢num不會(huì)被回收, 當(dāng)子函數(shù)執(zhí)行完畢返回賦值最外層全局環(huán)境變量add,記錄狀態(tài), 這其實(shí)也是內(nèi)存泄露案例
關(guān)閉內(nèi)存管理
· 一般棧存放(基本類型的值)不會(huì)泄漏,堆存放(引用類型的值是對(duì)象)才會(huì)造成泄漏
· 一般小內(nèi)存泄露不會(huì)對(duì)程序造成影響,但是大型項(xiàng)目,防止積少成多,養(yǎng)成良好編程習(xí)慣
更多關(guān)于html5培訓(xùn)的問(wèn)題,歡迎咨詢千鋒教育在線名師,如果想要了解我們的師資、課程、項(xiàng)目實(shí)操的話可以點(diǎn)擊咨詢課程顧問(wèn),獲取試聽資格來(lái)試聽我們的課程,在線零距離接觸千鋒教育大咖名師,讓你輕松從入門到精通。