溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JSt的垃圾回收機(jī)制介紹

發(fā)布時(shí)間:2020-05-25 14:39:30 來(lái)源:億速云 閱讀:254 作者:鴿子 欄目:web開(kāi)發(fā)

前言

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)注億速云其它相關(guān)文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI