瀏覽器垃圾回收

垃圾回收算法(v8)

可達性:從根節點出發,遍歷全部的對象,能夠遍歷到的對象,就是可達的 算法

根節點包含:數組

  1. 全局變量window
  2. 文檔DOM
  3. 存放在棧上的變量

瀏覽器

let dog.a = new Array(1)

image.png
若是此時,將另一個對象賦給a閉包

dog.a = new Object()

image.png
那麼從根節點棧dog一步一步遍歷,發現堆Array不可達的,那麼它就要被回收掉。函數

此時會引出一個概念: 內存碎片
內存碎片就是不可達的對象被回收後,內存中會存在大量的不連續空間

還有一個問題:瀏覽器在進行垃圾回收的時候,會暫停JS腳本,可能會致使頁面卡頓
因此新引擎對其進行了優化優化

分代收集

瀏覽器將數據分爲兩種:長久對象臨時對象
生命週期很長的對象,好比全局的window/DOM等屬於長久對象
存活時間短,好比函數內部變量,塊級做用域變量等屬於臨時對象
與之對應的垃圾回收器分別是主垃圾回收器副垃圾回收器spa

主垃圾回收器

運用優化版可達性回收算法標記-清除,在遍歷過程當中,可達的對象進行標記,那麼最後沒有標記的就判斷爲垃圾數據。code

標記: 一個對象訪問一次

屢次回收也會出現內存碎片,須要進行內存整理對象

副垃圾回收器

負責臨時對象的垃圾回收,一般只支持1~8M的容量
分爲兩個區域: 對象區域空閒區域
新加入的對象都被放入對象區域,等對象區域快滿的時候,會執行一次垃圾清理
清理過程:blog

  • 先給對象區域全部對象進行標記
  • 把標記的可達的對象複製到空閒區域,而且將它們有序的排列一邊
  • 對象區域與空閒區域對調
在這個模式下,就不會出現內存碎片問題

增量回收

爲了解決優化過程當中頁面延遲問題的優化
將垃圾回收工做分紅更小的塊,每次處理一部分,屢次處理,這樣就會避免長時間的停頓

閒時收集

也是一種優化,垃圾收集器只會在 CPU 空閒時嘗試運行,以減小可能對代碼執行的影響

內存泄漏

用不到的變量,不能被垃圾回收機制回收,依然佔據着內存空間
常見場景:

  • 監聽在window/body事件沒有解綁
  • Vue中的$storewatch以後沒有unwatch
  • 互相引用
  • 定時器
  • 濫用閉包

優化:

  • 弱引用weakMap/weakset
  • 數組複用:arr.length = 0
  • 對象複用:t = null

weakMap和weakset

弱引用,特色:不能確保其引用的對象不會被垃圾回收器回收

var obj1 = new Object() // 強引用
var obj2 = new WeakMap() // 弱引用

若是兩個對象什麼都不作,那麼obj2就會被回收掉,而obj1要設置obj1=null纔會被回收

相關文章
相關標籤/搜索