亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

您的位置:首頁技術(shù)文章
文章詳情頁

談?wù)凧avaScript中的垃圾回收機(jī)制

瀏覽:57日期:2023-10-13 08:29:22

JavaScript 具有自動(dòng)垃圾收集機(jī)制,也就是說,執(zhí)行環(huán)境會(huì)負(fù)責(zé)管理代碼執(zhí)行過程中使用的內(nèi)存。

在編寫 JavaScript 程序時(shí),開發(fā)人員不用再關(guān)心內(nèi)存使用問題,所需內(nèi)存的分配以及無用內(nèi)存的回收完全實(shí)現(xiàn)了自動(dòng)管理。

這種垃圾收集機(jī)制的原理其實(shí)很簡單:找出那些不再繼續(xù)使用的變量,然后釋放其占用的內(nèi)存。為此,垃圾收集器會(huì)按照固定的時(shí)間間隔(或代碼執(zhí)行中預(yù)定的收集時(shí)間), 周期性地執(zhí)行這一操作。

具體到瀏覽器中的實(shí)現(xiàn),則通常有兩個(gè)策略,分別為標(biāo)記清除和引用計(jì)數(shù)。

一、標(biāo)記清除

JavaScript 中最常用的垃圾收集方式是標(biāo)記清除(mark-and-sweep)。當(dāng)變量進(jìn)入環(huán)境(例如,在函數(shù)中聲明一個(gè)變量)時(shí),就將這個(gè)變量標(biāo)記為“進(jìn)入環(huán)境”。而當(dāng)變量離開環(huán)境時(shí),則將其標(biāo)記為“離開環(huán)境”。

垃圾收集器在運(yùn)行的時(shí)候會(huì)給存儲(chǔ)在內(nèi)存中的所有變量都加上標(biāo)記??梢允褂萌魏螛?biāo)記方式,比如,可以通過翻轉(zhuǎn)某個(gè)特殊的位來記錄一個(gè)變量何時(shí)進(jìn)入環(huán)境, 或者使用一個(gè)“進(jìn)入環(huán)境的”變量列表及一個(gè)“離開環(huán)境的”變量列表來跟蹤哪個(gè)變量發(fā)生了變化。

然后,它會(huì)去掉環(huán)境中的變量以及被環(huán)境中的變量引用的變量的標(biāo)記。而在此之后再被加上標(biāo)記的變量將被視為準(zhǔn)備刪除的變量,原因是環(huán)境中的變量已經(jīng)無法訪問到這些變量了。

最后,垃圾收集器完成內(nèi)存清除工作,銷毀那些帶標(biāo)記的值并回收它們所占用的內(nèi)存空間。

二、引用計(jì)數(shù)

另一種不太常見的垃圾收集策略叫做引用計(jì)數(shù)(reference counting)。引用計(jì)數(shù)的含義是跟蹤記錄每個(gè)值被引用的次數(shù)。

當(dāng)聲明了一個(gè)變量并將一個(gè)引用類型值賦給該變量時(shí),則這個(gè)值的引用次數(shù)就是 1。 如果同一個(gè)值又被賦給另一個(gè)變量,則該值的引用次數(shù)加 1。相反,如果包含對這個(gè)值引用的變量又取得了另外一個(gè)值,則這個(gè)值的引用次數(shù)減 1。

當(dāng)這個(gè)值的引用次數(shù)變成 0 時(shí),則說明沒有辦法再訪問這個(gè)值了,因而就可以將其占用的內(nèi)存空間回收回來。

這樣,當(dāng)垃圾收集器下次再運(yùn)行時(shí),它就會(huì)釋放那些引用次數(shù)為零的值所占用的內(nèi)存。

存在的問題:只要在 IE 中涉及 COM(Component Object Model,組件對象模型)對象,就會(huì)存在循環(huán)引用的問題。如下面代碼所示:

var element = document.getElementById('some_element');var myObject = new Object();myObject.element = element;element.someObject = myObject;

這個(gè)例子在一個(gè) DOM 元素(element)與一個(gè)原生 JavaScript 對象(myObject)之間創(chuàng)建了循環(huán)引用。

其中,變量 myObject 有一個(gè)名為 element 的屬性指向 element 對象。

而變量 element 也有 一個(gè)屬性名叫 someObject 回指 myObject。

由于存在這個(gè)循環(huán)引用,即使將例子中的 DOM 從頁面中移除,它也永遠(yuǎn)不會(huì)被回收。

解決方法:最好是在不使用它們的時(shí)候手工斷開原生 JavaScript 對象與 DOM 元素之間的連接。

myObject.element = null;element.someObject = null;

將變量設(shè)置為 null 意味著切斷變量與它此前引用的值之間的連接。當(dāng)垃圾收集器下次運(yùn)行時(shí),就會(huì)刪除這些值并回收它們占用的內(nèi)存。

三、管理內(nèi)存

確保占用最少的內(nèi)存可以讓頁面獲得更好的性能。而優(yōu)化內(nèi)存占用的最佳方式,就是為執(zhí)行中的代碼只保存必要的數(shù)據(jù)。

一旦數(shù)據(jù)不再有用,最好通過將其值設(shè)置為 null 來釋放其引用——這個(gè)做法叫做解除引用(dereferencing)。

這一做法適用于大多數(shù)全局變量和全局對象的屬性。局部變量會(huì)在它們離開執(zhí)行環(huán)境時(shí)自動(dòng)被解除引用,如下面這個(gè)例子所示:

function createPerson(name){ var localPerson = new Object(); localPerson.name = name; }var globalPerson = createPerson('Nicholas');globalPerson = null; // 手工解除globalPerson 的引用

   變量 globalPerson 取得了 createPerson()函數(shù)返回的值。在 createPerson() 函數(shù)內(nèi)部,我們創(chuàng)建了一個(gè)對象并將其賦給局部變量localPerson,然后又為該對象添加了一個(gè)名為 name 的屬性。最后,當(dāng)調(diào)用這個(gè)函數(shù)時(shí),localPerson 以函數(shù)值的形式返回并賦給全局變量 globalPerson。

由于 localPerson 在 createPerson()函數(shù)執(zhí)行完畢后就離開了其執(zhí)行環(huán)境,因此無需我們顯式地去為它解除引用。

但是對于全局變量 globalPerson 而言,則需要我們在不使用它的時(shí)候手工為它解除引用,這也正是上面例子中最后一行代碼的目的。

以上就是談?wù)凧avaScript中的垃圾回收機(jī)制的詳細(xì)內(nèi)容,更多關(guān)于JavaScript 垃圾回收的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 免费观看大片毛片 | 欧美一级一极性活片免费观看 | 久久99精品久久久久久 | 精品久久一区二区 | 日本国产欧美色综合 | 国产黄毛片 | 精品少妇一区二区三区视频 | 国内成人自拍视频 | 在线精品一区二区三区 | 精品国产夜色在线 | 中文字幕在线无限2021 | 日韩精品一区二区三区中文在线 | 亚洲成成品网站有线 | 欧美成人 综合网播九公社 欧美成人26uuu欧美毛片 | 日韩精品中文字幕在线 | 男女牲高爱潮免费视频男女 | 欧美亚洲视频在线观看 | 欧美中文字幕在线视频 | 黄色成人免费观看 | 国产a国产片国产 | 很黄很色的摸下面的视频 | 一级毛片免费视频观看 | 中文字幕在线乱码不卡区区 | 久草资源在线视频 | 国产在线一区二区三区四区 | 99久久精品免费看国产 | 自拍第1页 | 国产成人午夜极速观看 | 国产主播福利精品一区二区 | 免费a级在线观看播放 | 一级一黄在线观看视频免费 | 521a久久九九久久精品 | 黄色成人在线 | 国产伦精品一区二区三区四区 | 国产成人精品视频午夜 | 国产a级午夜毛片 | 亚洲欧美人妖另类激情综合区 | 一级毛片免费在线播放 | 日本三级欧美三级 | 国产欧美日韩不卡在线播放在线 | 亚洲 自拍 另类 欧美 综合 |