可達性
:從根節點出發,遍歷全部的對象,能夠遍歷到的對象,就是可達的 算法
根節點包含:數組
window
DOM
樹例瀏覽器
let dog.a = new Array(1)
若是此時,將另一個對象賦給a閉包
dog.a = new Object()
那麼從根節點棧dog
一步一步遍歷,發現堆Array
是不可達的,那麼它就要被回收掉。函數
此時會引出一個概念: 內存碎片
內存碎片就是不可達的對象被回收後,內存中會存在大量的不連續空間
還有一個問題:瀏覽器在進行垃圾回收的時候,會暫停JS腳本,可能會致使頁面卡頓
因此新引擎對其進行了優化優化
瀏覽器將數據分爲兩種:長久對象和臨時對象
生命週期很長的對象,好比全局的window/DOM
等屬於長久對象
存活時間短,好比函數內部變量,塊級做用域變量等屬於臨時對象
與之對應的垃圾回收器分別是主垃圾回收器和副垃圾回收器spa
運用優化版可達性
回收算法標記-清除
,在遍歷過程當中,可達的對象進行標記,那麼最後沒有標記的就判斷爲垃圾數據。code
標記: 一個對象訪問一次
屢次回收也會出現內存碎片,須要進行內存整理對象
負責臨時對象的垃圾回收,一般只支持1~8M的容量
分爲兩個區域: 對象區域和空閒區域
新加入的對象都被放入對象區域,等對象區域快滿的時候,會執行一次垃圾清理
清理過程:blog
在這個模式下,就不會出現內存碎片問題
爲了解決優化過程當中頁面延遲問題的優化
將垃圾回收工做分紅更小的塊,每次處理一部分,屢次處理,這樣就會避免長時間的停頓
也是一種優化,垃圾收集器只會在 CPU 空閒時嘗試運行,以減小可能對代碼執行的影響
用不到的變量,不能被垃圾回收機制回收,依然佔據着內存空間
常見場景:
window/body
事件沒有解綁$store
,watch
以後沒有unwatch
優化:
weakMap/weakset
弱引用,特色:不能確保其引用的對象不會被垃圾回收器回收
var obj1 = new Object() // 強引用 var obj2 = new WeakMap() // 弱引用
若是兩個對象什麼都不作,那麼obj2
就會被回收掉,而obj1
要設置obj1=null
纔會被回收