Javascript垃圾收集機制介紹
經常使用 Javascript 的人會琢磨其垃圾收集機制,Javascript 並不像 C,C++ 那樣需要開發者手動去清除垃圾,在編寫 Javascript 程序是,開發者無需關心內存使用問題,所需內存分配以及無用內存(垃圾)的回收完全實現了自動管理。究其根源,主要是程序收集那些不再使用的變量,並且釋放其佔用的內存。因此,垃圾收集機制會按照固定時間間隔,週期性反覆的執行這一操作。
舉例來説,局部變量只存在於函數內部,程序會為局部變量在棧內存或堆內存中分配對應的存儲空間,當函數運行結束,局部變量所佔用的內存就沒有存在的必要了,這時程序會釋放局部變量所佔用的內存供其他變量使用。這是程序最簡單釋放內存的方法,但是很多時候,程序中變量會一直被使用,此時垃圾收集機制必須跟蹤變量並且判斷其是否被使用,是否可以釋放其內存空間。
垃圾收集機制主要判斷變量釋放內存空間的方法有兩個:其一是標記清除法,其二是引用計數法。
一、標記法,每個變量都有其運行環境,變量創建後會在某種環境中運行,比如創建一個局部變量,局部變量會運行在函數體內。當函數運行時,會標記局部變量為“進入環境”,當函數體運行結束後,意味着變量脱離了其運行環境,此時則將變量標記為“離開環境”。對於“離開環境”的變量,垃圾收集機制會進行相應記錄,並且在下一個回收週期時將其釋放。
二、引用計數法,跟蹤記錄每個值的被引用次數。聲明一個變量並將一個引用類型值賦給該變量時,這個值得引用次數就是 1。如果同一個值又被賦給另外一個變量,則該值的引用次數加 1。相反,如果包含對這個值的引用的變量又取得另外一個值,這個值得引用次數減 1。當這個值得引用次數為 0 時,則説明沒有辦法再訪問到此值,因此就可以將其佔用的內存空間回收。當垃圾收集器在下一個週期運行時,會釋放引用次數為零的值所佔用的內存空間。(原文解釋參考:Javascript 高級程序設計 - 第二版)
舉個例子來説:
複製代碼 代碼如下:
function countMethod(){
var object1 = new Object(); // 聲明變量,計數器由 0 變為 1
var object2 = new Object(); // 聲明變量,計數器由 0 變為 1
od1 = object2; // object1 計數器 -1,object2 計數器 +1
od2 = object1; // object1 計數器 +1,object2 計數器 -1
}
此函數運行退出後,object1 的'計數器讀數為 1,object2 的計數器度數為 1。所以兩個變量都不會被銷燬。如果大量的這樣的程序存在於函數體內,就會導致大量的內存被浪費而無法回收,從而導致內存的泄露。
上述問題解決方法,手動釋放 object1 object2 所佔用的內存。即:
複製代碼 代碼如下:
od1 = null;
od2 = null;
對比上面的例子,舉一個正常情況下的例子。
複製代碼 代碼如下:
function countMethod(){
var object1 = new Object(); // 聲明變量,計數器由 0 變為 1
var object2 = new Object(); // 聲明變量,計數器由 0 變為 1
od1 = "This is object1"; // object1 計數器 -1,object1 讀數變為0
od2 = "This is object2"; // object2 計數器 -1,object2 讀數變為0}
通過上例看出,正常情況下,當函數運行結束後,object1 object2的讀數均為 0,在下一個垃圾收集週期時,會被回收並且釋放其所佔用的內存。
-
怎麼使用Javascript獲取距今n天前的日期
複製代碼代碼如下:functionTest(day){vartoday=newDate();varbeforMilliseconds=ime()-1000*3600*24*day;varbeforday=newDate();ime(beforMilliseconds);varstrYear=ullYear();varstrDay=ate();varstrMonth=onth()+1;if(strMonth<10){strMonth="0"+strMonth;}...
-
萬惡的function在javascript中的運用實例分析
javascript中最有特色而又讓你困惑的function算一個了下面看一下常用操作複製代碼代碼如下:functiondoit(){.....}doit();javascript中的函數我們可以把它當作方法使用複製代碼代碼如下:varobj=newObject();=function(){.....}();而function實際上就是對象(即F...
-
JavaScript 小型打飛機遊戲實現和原理説明
JavaScript小型打飛機遊戲實現和原理説明玩法説明:上下左右控制移動,空格發彈。每打中一個敵機就加100分,每提升5000分,玩家的飛機的一次發彈數就加一,最多四,被敵機撞到或者讓敵機飛到底部就算輸。。。。演示代碼:http://demo./js/FlyBeat/遊戲目前的功能還是比較簡...
-
網頁設計很糟糕的10個原因
個好的網頁設計,不僅吸引眼球,也是實用的、直觀的、層級簡單卻足夠複雜到保持用户的興趣。但是不好的網頁設計是由很多原因造成的,下面是關於網頁設計很糟糕的10個原因,歡迎閲讀了解!沒有足夠的空白空白可以説是設計中最重要的一部分。它有助於防止用户在瀏覽網站時...