前言
10年積累的成都網(wǎng)站建設(shè)、做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有芷江免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
JS具有自動(dòng)垃圾回收機(jī)制,換句話說(shuō),執(zhí)行環(huán)境會(huì)管理代碼執(zhí)行過(guò)程中使用的內(nèi)存。
JS垃圾回收的原理
執(zhí)行環(huán)境會(huì)找出那些不再繼續(xù)使用的變量,然后釋放其占用的內(nèi)存。
JS垃圾回收的策略
標(biāo)記清除
當(dāng)變量進(jìn)入環(huán)境時(shí),就將這個(gè)變量標(biāo)記為“進(jìn)入環(huán)境”,而當(dāng)變量離開(kāi)環(huán)境時(shí),則將其標(biāo)記為“離開(kāi)環(huán)境”。
標(biāo)記變量方式看具體的實(shí)現(xiàn),比如可以使用一個(gè)“進(jìn)入環(huán)境”的變量列表和一個(gè)“離開(kāi)環(huán)境”的變量列表來(lái)跟蹤哪個(gè)變量發(fā)生了變化。
使用過(guò)標(biāo)記清除的瀏覽器有IE,F(xiàn)irefox,chrome。
引用計(jì)數(shù)
這是一種不太常見(jiàn)的垃圾回收的策略,它就是跟蹤每一個(gè)值被引用的次數(shù)。
當(dāng)聲明了一個(gè)變量a并將一個(gè)引用類型值({name:'cc'})賦給該變量時(shí),則這個(gè)值的引用次數(shù)就是1,如果a({name:'cc'})又賦給另一個(gè)變量b,則該值的引用次數(shù)加1。反之,如果a賦值{name:'xx'},則{name:'cc'}這個(gè)值的引用次數(shù)減1。當(dāng){name:'cc'}這個(gè)值的引用的次數(shù)變?yōu)?時(shí),則說(shuō)明沒(méi)有辦法再訪問(wèn){name:'cc'}這個(gè)值了,因而可以將其占用的內(nèi)存空間回收。這樣,當(dāng)垃圾回收器工作的時(shí)候,{name:'cc'}這個(gè)值占用的內(nèi)存空間就會(huì)被回收。
這種方式曾今被Netscape Navigator 3.0使用過(guò),但是有一個(gè)嚴(yán)重問(wèn)題:循環(huán)引用。
function circleReferenceProbem(){ let objectA = new Object() let objectB = new Object() objectA.someOtherObject = objectB objectB.anotherObject = objectA }
執(zhí)行這個(gè)函數(shù)后,因?yàn)檫@兩個(gè)引用值的引用次數(shù)永遠(yuǎn)不會(huì)為0,垃圾回收器永遠(yuǎn)不會(huì)回收它們占用的內(nèi)存空間。
JS垃圾回收器的性能
因?yàn)镴S垃圾回收器是每隔一個(gè)周期就執(zhí)行一次垃圾回收。
如果為變量分配的內(nèi)存數(shù)量不大的話,那么垃圾回收器的回收工作量就不大。但是,當(dāng)垃圾回收器的工作量過(guò)大的時(shí)候,就很可能會(huì)出現(xiàn)卡頓的情況。
JS中管理內(nèi)存的建議
1、盡量少用全局變量
2、盡可能手動(dòng)清除變量的引用
以上就是快速理解 JavaScript 的垃圾回收的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!