国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

javascript垃圾收集知識點概要(三)

jayce / 2972人閱讀

摘要:可是,引用計數導致的麻煩并未就此終結。其中,變量有一個名為的屬性指向對象而變量也有一個屬性名為回指。當垃圾收集器下次運行時,就會刪除這些值并回收它們所占用的內存。

引用計數
  

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

Netscape Navigator3.0是最早使用引用計數策略的瀏覽器,但很快它就遇到了一個嚴重的問題:循環利用。循環利用指的是對象A中包含一個指向對象B的指針,而對象B中也包含一個指向對象A的引用。請看下面這個例子:

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

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

在這個例子中,objectA和objectB通過各自的屬性相互引用;也就是說,這兩個對象的應用次數都是2.在采用標記清除策略的實現中,由于函數執行之后,這兩個對象都離開了作用域,因此這種相互引用不是個問題。但在采用引用計數策略的實現中,當函數執行完畢之后,objectA和objectB還將繼續存在,因為它們的應用次數永遠不會是0.假如這個函數被重復調用,就會導致大量內存得不到回收。因此,Netscape在Navigator4.0中放棄了引用計數方式,轉而采用了標記清除來實現其垃圾收集機制。可是,引用計數導致的麻煩并未就此終結。

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

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

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

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

將變量設置為null意味著切斷變量與此前引用的值之間的連接。當垃圾收集器下次運行時,就會刪除這些值并回收它們所占用的內存。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85325.html

相關文章

  • javascript垃圾收集識點概要(二)

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

    TesterHome 評論0 收藏0
  • javascript垃圾收集識點概要(一)

    摘要:待分析下面我們來分析一下函數中局部變量的正常聲明周期。局部變量只在函數執行的過程中存在。此時,局部變量就沒有存在的必要了,因此可以釋放他們的內存以供將來使用。 以下總結內容來自《JavaScript高級程序》(第三版) 頁碼:78 JavaScript具有自動垃圾收集機制,也就是說,執行環境會負責管理代碼執行過程中使用的內存。而在C和C++之類的語言中,開發人員的一項基本任務就...

    Cheriselalala 評論0 收藏0
  • JavaScript如何工作:內存管理+如何處理4個常見的內存泄漏

    摘要:本系列的第一篇文章簡單介紹了引擎運行時間和堆棧的調用。編譯器將插入與操作系統交互的代碼,并申請存儲變量所需的堆棧字節數。當函數調用其他函數時,每個函數在調用堆棧時獲得自己的塊。因此,它不能為堆棧上的變量分配空間。 本系列的第一篇文章簡單介紹了引擎、運行時間和堆棧的調用。第二篇文章研究了谷歌V8 JavaScript引擎的內部機制,并介紹了一些編寫JavaScript代碼的技巧。 在這第...

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

    摘要:堆內存使用分析,垃圾收集器日志解讀重要的東東在中,對象實例都是在堆上創建。機制是由提供,用來清理需要清除的對象,回收堆內存。在中,是由一個被稱為垃圾回收器的守護線程執行的。 堆內存使用分析,垃圾收集器 GC 日志解讀 重要的東東 在Java中,對象實例都是在堆上創建。一些類信息,常量,靜態變量等存儲在方法區。堆和方法區都是線程共享的。 GC機制是由JVM提供,用來清理需要清除的對象,...

    CODING 評論0 收藏0
  • 【進階1-4期】JavaScript深入之帶你走進內存機制

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

    不知名網友 評論0 收藏0

發表評論

0條評論

jayce

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<