一、垃圾回識訓制的必要性
由于字串、物件和陣列沒有固定大小,所以當它們的大小已知時,才能對它們進行動態的存盤分配,JavaScript程式每次創建字串、陣列或物件時,解釋器都必須分配記憶體來存盤那個物體,只要像這樣動態地分配了記憶體,最終都要釋放這些記憶體以便它們能夠被再用,否則,JavaScript的解釋器將會消耗完系統中所有可用的記憶體,造成系統崩潰,
JavaScript的解釋器可以檢測到何時程式不再使用一個物件了,當它確定了一個物件是無用的時候,它就知道不再需要這個物件,可以把它所占用的記憶體釋放掉了,
二、垃圾回識訓制
Js具有自動垃圾回識訓制,垃圾收集器會按照固定的時間間隔周期性的執行,
1、標記清除(常用)
當一塊記憶體中的資料能夠被訪問時,垃圾回收器就認為"該資料能夠被獲得",不能夠被獲得的資料,就會被打上標記,并回收記憶體空間,這種方式叫作標記---清除演算法,
這個演算法會設定一個全域物件,并定期地從全域物件開始查找,垃圾回收器會找到所有可以獲得與不能獲得的資料,
作業流程:
(1)垃圾回收器,在運行的時候會給存盤在記憶體中的所有變數都加上標記,
(2)去掉環境中的變數以及被環境中的變數參考的變數的標記,
(3)再被加上標記的會被視為準備洗掉的變數,
(4)垃圾回收器完成記憶體清除作業,銷毀那些帶標記的資料并回收它們所占用的記憶體空間,
注意:在區域作用域中,當函式執行完畢后,區域變數也就沒有存在的必要了,因此垃圾收集器很容易做出判斷并回收,但在全域中,變數什么時候需要自動釋放記憶體空間則很難判斷,因此我們在開發時,應盡量避免使用全域變數,如果使用了全域變數,則建議不再使用它時,通過釋放變數方式,以確保能夠及時回收記憶體空間,
2、參考計數
跟蹤記錄每個值被參考的次數,例當變數宣告,第一次賦值時記為1,然后當這個變數值改變時,記錄為0,將計數為0的回收,
作業流程:
(1)宣告了一個變數并將一個參考型別的值賦值給這個變數,這個參考型別值的參考次數就是1,
(2)同一個值又被賦值給另一個變數,這個參考型別值的參考次數加1.
(3)當包含這個參考型別值的變數又被賦值成另一個值了,那么這個參考型別值的參考次數減1.
(4)當參考次數變成0時,說明沒辦法訪問這個值了,
(5)當垃圾收集器下一次運行時,它就會釋放參考次數是0的值所占的記憶體,
但是當回圈參考的時候就會釋放不掉記憶體,
1 function problem() { 2 var objA = new Object(); 3 var objB = new Object(); 4 5 objA.someOtherObject = objB; 6 objB.anotherObject = objA; 7 }
當objA和objB通過各自的屬性相互參考,也就是說這兩個物件的參考次數都是2,在采用參考計數的策略中,由于函式執行之后,這兩個物件都離開了作用域,函式執行完成之后,objA和objB還將會繼續存在,因為他們的參考次數永遠不會是0,這樣的相互參考如果說很大量的存在就會導致大量的記憶體泄露,
因為IE中的BOM、DOM的實作使用了COM,而COM物件使用的垃圾收集機制是參考計數策略,所以會存在回圈參考的問題,
解決:手工斷開js物件和DOM之間的鏈接,賦值為null,IE9把DOM和BOM轉換成真正的JS物件了,所以避免了這個問題,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/113723.html
標籤:JavaScript
上一篇:JavaScript連載6-轉化為Number和Boolean型別、運算子
下一篇:監視DOM樹屬性的更改
