死磕JavaScript-垃圾收集機制

Bacer發表於2021-09-09

JavaScript和Java一樣具有自動垃圾收集機制。JavaScript的垃圾收集你機制的原理很簡單:找出那些不再繼續使用的變數,然後釋放其佔用的記憶體。

標記清除:這是最常用的垃圾收集方式。原理是:垃圾收集器在執行的時候會給儲存在記憶體中的所有變數都加上標記—>然後,它會去掉環境中的變數以及被環境中的變數引用的變數的標記—>在此之後再被加上標記的變數將被視為準備刪除的變數—>最後,垃圾收集器完成記憶體清除工作,銷燬那些帶標記的變數並回收它們所佔用的記憶體空間。

引用計數:這是一種不太常見的垃圾收集方式,IE用的就是這種。引用計數是指追蹤記錄每個值被引用的次數,原理是:當宣告一個變數並將一個引用型別值賦給該變數時,則這個值得引用次數初始化為1—>如果同一個值又被賦值給另一個變數,則該值的引用次數加1—>相反,如果包含對這個值引用的變數又取得了另外一個值,則這個值得引用次數減1—>當這個值得引用次數變為0時,說明無需再訪問這個變數,可以被垃圾回收機制回收。
圖片描述

但引用計數存在迴圈引用的風險,迴圈引用指的是物件A包含一個指向物件B的指標,而物件B中也包含一個指向物件A的引用。比如:

這裡例子中,objectA和objectB透過各自的屬性相互引用,也就是說,兩個物件的引用次數都是2,儘管函式執行完畢後,objectA和objectB還將繼續存在,因為它們的引用次數永遠都不為0。

IE因為採用了引用計數的垃圾收集而效能低下。

當然,我們也可以透過解除變數的引用(解除引用)來消除迴圈引用現象,比如:objectA = null;和objectB = null。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2768/viewspace-2807767/,如需轉載,請註明出處,否則將追究法律責任。

相關文章