瀏覽器的垃圾回收機制及原理


瀏覽器的垃圾回收機制

在 JS 中創建一個變量的時候,系統會根據,變量的類型,自動為其分配對應的內存

基礎類型 -> 棧內存,固定大小;
對象類型 -> 堆內存,根據需要分配大小,並給一個地址。

正常情況下,當這些變量不再被使用的時候,就會被回收,內存被釋放。因為內存作為一種資源是有限的,一直被占用就會導致程序運行速度減慢甚至系統崩潰等嚴重后果。

垃圾回收原理淺析(垃圾回收機制是如何實現的、垃圾回收機制的實現原理)

現在各大瀏覽器通常采用的垃圾回收有兩種方法:標記清除、引用計數。

1. 標記清除(mark and sweep)

大部分瀏覽器以此方式進行垃圾回收,當變量進入執行環境(函數中聲明變量,執行時)的時候,垃圾回收器將標記為“進入環境”,當變量離開環境的時候(函數執行結束)將其標記為“離開環境”。
標記的方式不定,可以是某個特殊位的反轉或者維護一個列表等。
瀏覽器會在空閑的時間,刪除這些不再在被使用的變量,釋放內存資源。

2. 引用計數(reference counting)

另一種不太常見的垃圾收集策略叫做引用計數(reference counting)。引用計數的含義是跟蹤記錄每個值被引用的次數。

  當聲明了一個變量並將一個引用類型值賦值該變量時,則這個值的引用次數就是1.如果同一個值又被賦給另外一個變量,則該值得引用次數加1。相反,如果包含對這個值引用的變量又取 得了另外一個值,則這個值的引用次數減 1。當這個值的引用次數變成 0時,則說明沒有辦法再訪問這個值了,因而就可以將其占用的內存空間回收回來。這樣,當垃圾收集器下次再運行時,它就會釋放那 些引用次數為零的值所占用的內存。
  問題:循環引用。循環引用指的是對象A中包含一個指向對象B的指針,而對象B中也包含一個指向對象A的引用。請看下面這個例子

function loop() {
  var a = {};
  var b = {};
  a.prop = b;
  b.prop = a;
}

這中情況下每次調用 loop() 函數,a 和 b 的引用計數都是 2,會使這部分內存永遠不會被釋放,即內存泄露。

JS常見內存泄漏及解決方案解析


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM