亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

javascript垃圾收集知識(shí)點(diǎn)概要(三)

jayce / 3030人閱讀

摘要:可是,引用計(jì)數(shù)導(dǎo)致的麻煩并未就此終結(jié)。其中,變量有一個(gè)名為的屬性指向?qū)ο蠖兞恳灿幸粋€(gè)屬性名為回指。當(dāng)垃圾收集器下次運(yùn)行時(shí),就會(huì)刪除這些值并回收它們所占用的內(nèi)存。

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

另一種不太常見的垃圾收集策略叫做引用計(jì)數(shù)(reference counting)。引用計(jì)數(shù)的含義是跟蹤記錄每個(gè)值被引用的次數(shù)。當(dāng)聲明了一個(gè)變量并將一個(gè)應(yīng)用類型值賦給該變量時(shí),則這個(gè)值的應(yīng)用次數(shù)就是1。如果同一個(gè)值又被賦給另一個(gè)變量,這該值的引用次數(shù)加1。相反,如果包含對(duì)這個(gè)值引用的變量又取得了另外一個(gè)值,則該值的應(yīng)用次數(shù)減1。當(dāng)這個(gè)值的應(yīng)用次數(shù)變成0時(shí),則說(shuō)明沒有辦法再訪問這個(gè)值了,因而就可以將其占用的內(nèi)存空間回收回來(lái)。這樣,當(dāng)垃圾收集器下次再運(yùn)行時(shí),它就會(huì)釋放那些引用次數(shù)為零的值所占用的內(nèi)存。

Netscape Navigator3.0是最早使用引用計(jì)數(shù)策略的瀏覽器,但很快它就遇到了一個(gè)嚴(yán)重的問題:循環(huán)利用。循環(huán)利用指的是對(duì)象A中包含一個(gè)指向?qū)ο驜的指針,而對(duì)象B中也包含一個(gè)指向?qū)ο驛的引用。請(qǐng)看下面這個(gè)例子:

function problem(){
    var objectA = new Object();
    var objectB = new Object();

    objectA.someOtherObject = objectB;
    objectB.anotherObject = objectA;
}
  

在這個(gè)例子中,objectA和objectB通過(guò)各自的屬性相互引用;也就是說(shuō),這兩個(gè)對(duì)象的應(yīng)用次數(shù)都是2.在采用標(biāo)記清除策略的實(shí)現(xiàn)中,由于函數(shù)執(zhí)行之后,這兩個(gè)對(duì)象都離開了作用域,因此這種相互引用不是個(gè)問題。但在采用引用計(jì)數(shù)策略的實(shí)現(xiàn)中,當(dāng)函數(shù)執(zhí)行完畢之后,objectA和objectB還將繼續(xù)存在,因?yàn)樗鼈兊膽?yīng)用次數(shù)永遠(yuǎn)不會(huì)是0.假如這個(gè)函數(shù)被重復(fù)調(diào)用,就會(huì)導(dǎo)致大量?jī)?nèi)存得不到回收。因此,Netscape在Navigator4.0中放棄了引用計(jì)數(shù)方式,轉(zhuǎn)而采用了標(biāo)記清除來(lái)實(shí)現(xiàn)其垃圾收集機(jī)制??墒?,引用計(jì)數(shù)導(dǎo)致的麻煩并未就此終結(jié)。

我們知道,IE中有一部分對(duì)象并不是原生的JavaScript對(duì)象。例如,其BOM和DOM中的對(duì)象就是使用C++以COM(Component Object Model,組件對(duì)象模型)對(duì)象的形式實(shí)現(xiàn)的,而COM對(duì)象的垃圾收集機(jī)制采用的就是引用計(jì)數(shù)策略。因此,即使IE的JavaScript引擎是使用了標(biāo)記清除策略來(lái)實(shí)現(xiàn)的,但JavaScript訪問的COM對(duì)象依然是基于引用計(jì)數(shù)策略的。換句話說(shuō),只要在IE中涉及COM對(duì)象,就會(huì)在循環(huán)引用的問題。下面這個(gè)簡(jiǎn)單的例子,展示了使用COM對(duì)象導(dǎo)致循環(huán)引用的問題:

var element = document.getElementById("element");
var myObject = new Object();
myObject.elemnet = element;
element.someObject = myObject;
  

這個(gè)例子在一個(gè)DOM元素(element)與一個(gè)原生JavaScript對(duì)象之間創(chuàng)建了循環(huán)引用。其中,變量myObject有一個(gè)名為element的屬性指向element對(duì)象;而變量elemnet也有一個(gè)屬性名為someObject回指myObject。由于存在這個(gè)循環(huán)利用,即使將例子中的DOM從頁(yè)面中刪除,它也永遠(yuǎn)不會(huì)被回收。
為了避免類似這樣的循環(huán)引用問題,最好是在不使用它們的時(shí)候手工斷開原生JavaScript對(duì)象與DOM元素之間的連接。例如,可以使用下面的代碼消除前面例子創(chuàng)建的循環(huán)引用:

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

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/85325.html

相關(guān)文章

  • javascript垃圾收集識(shí)點(diǎn)概要(二)

    摘要:標(biāo)記清除中最常用的垃圾收集方式是標(biāo)記清除。最后,垃圾收集器完成內(nèi)存清除工作,銷毀那些帶標(biāo)記的值并回收他們所占用的內(nèi)存空間。到年為止,和的實(shí)現(xiàn)使用的都是標(biāo)記清除式的垃圾收集策略或類似的策略,只不過(guò)垃圾收集的時(shí)間間隔互有不同。 標(biāo)記清除 Javascript中最常用的垃圾收集方式是標(biāo)記清除(mark-and-sweep)。當(dāng)變量進(jìn)入環(huán)境(例如,在函數(shù)中聲明一個(gè)變量)時(shí),就將這個(gè)變量...

    TesterHome 評(píng)論0 收藏0
  • javascript垃圾收集識(shí)點(diǎn)概要(一)

    摘要:待分析下面我們來(lái)分析一下函數(shù)中局部變量的正常聲明周期。局部變量只在函數(shù)執(zhí)行的過(guò)程中存在。此時(shí),局部變量就沒有存在的必要了,因此可以釋放他們的內(nèi)存以供將來(lái)使用。 以下總結(jié)內(nèi)容來(lái)自《JavaScript高級(jí)程序》(第三版) 頁(yè)碼:78 JavaScript具有自動(dòng)垃圾收集機(jī)制,也就是說(shuō),執(zhí)行環(huán)境會(huì)負(fù)責(zé)管理代碼執(zhí)行過(guò)程中使用的內(nèi)存。而在C和C++之類的語(yǔ)言中,開發(fā)人員的一項(xiàng)基本任務(wù)就...

    Cheriselalala 評(píng)論0 收藏0
  • JavaScript如何工作:內(nèi)存管理+如何處理4個(gè)常見的內(nèi)存泄漏

    摘要:本系列的第一篇文章簡(jiǎn)單介紹了引擎運(yùn)行時(shí)間和堆棧的調(diào)用。編譯器將插入與操作系統(tǒng)交互的代碼,并申請(qǐng)存儲(chǔ)變量所需的堆棧字節(jié)數(shù)。當(dāng)函數(shù)調(diào)用其他函數(shù)時(shí),每個(gè)函數(shù)在調(diào)用堆棧時(shí)獲得自己的塊。因此,它不能為堆棧上的變量分配空間。 本系列的第一篇文章簡(jiǎn)單介紹了引擎、運(yùn)行時(shí)間和堆棧的調(diào)用。第二篇文章研究了谷歌V8 JavaScript引擎的內(nèi)部機(jī)制,并介紹了一些編寫JavaScript代碼的技巧。 在這第...

    anRui 評(píng)論0 收藏0
  • 《深入理解Java虛擬機(jī)》(六)堆內(nèi)存使用分析,垃圾收集器 GC 日志解讀

    摘要:堆內(nèi)存使用分析,垃圾收集器日志解讀重要的東東在中,對(duì)象實(shí)例都是在堆上創(chuàng)建。機(jī)制是由提供,用來(lái)清理需要清除的對(duì)象,回收堆內(nèi)存。在中,是由一個(gè)被稱為垃圾回收器的守護(hù)線程執(zhí)行的。 堆內(nèi)存使用分析,垃圾收集器 GC 日志解讀 重要的東東 在Java中,對(duì)象實(shí)例都是在堆上創(chuàng)建。一些類信息,常量,靜態(tài)變量等存儲(chǔ)在方法區(qū)。堆和方法區(qū)都是線程共享的。 GC機(jī)制是由JVM提供,用來(lái)清理需要清除的對(duì)象,...

    CODING 評(píng)論0 收藏0
  • 【進(jìn)階1-4期】JavaScript深入之帶你走進(jìn)內(nèi)存機(jī)制

    摘要:引擎對(duì)堆內(nèi)存中的對(duì)象進(jìn)行分代管理新生代存活周期較短的對(duì)象,如臨時(shí)變量字符串等。內(nèi)存泄漏對(duì)于持續(xù)運(yùn)行的服務(wù)進(jìn)程,必須及時(shí)釋放不再用到的內(nèi)存。 (關(guān)注福利,關(guān)注本公眾號(hào)回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實(shí)戰(zhàn)、面試指導(dǎo)) 本周正式開始前端進(jìn)階的第一期,本周的主題是調(diào)用堆棧,今天是第4天。 本計(jì)劃一共28期,每期重點(diǎn)攻克一個(gè)面試重難點(diǎn),如果你還不了解本進(jìn)階計(jì)劃...

    不知名網(wǎng)友 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<