JS性能優化是提升運行效率,下降運行開銷的行爲前端
前端性能優化無處不在,例如請求資源時的網絡,數據的傳輸方式,開發時使用的框架等c++
js內存管理
爲何須要管理(如圖查看內存佔用狀況)算法內存:由可讀寫單元組成,表示一片可操做空間瀏覽器
管理:人爲的去操做一片空間的申請,使用和釋放性能優化
內存管理:開發者主動申請空間,使用空間,釋放空間網絡
流程:申請-使用-釋放閉包
因爲es中沒有提供相應的內存管理API,因此JS不能像c,c++同樣由開發者主動調用相應API完成空間管理框架
//申請(js執行引擎遇到變量定義語句時自動分配內存空間) let obj = {} //使用 obj.name = "mcgee" //釋放 obj = null
js中的垃圾回收前端性能
js中的內存管理是自動的函數
- 對象再也不被引用時是垃圾
- 對象不能從根上訪問到時是垃圾
js中的可達對象
能夠訪問到的對象就是可達對象(引用,做用域鏈)
可達的標準就是從根出發是否可以被找到
js中的根就能夠理解爲全局變量對象
//mcgee對象空間被nm引用。在全局執行上下文下,nm是可達的對象,間接意味着mcgee對象空間也是可達的 let nm = {name:"mcgee"} //對象空間又多了一層引用 let ali = nm //去除nm對對象的引用 nm = null
function objGroup(obj1,obj2){ obj1.next = obj2 obj2.prev = obj1 return { o1:obj1, o2:obj2 } } const result = objGroup({name:"obj1"},{name:"obj2"}) console.log(result)
若是我要刪除obj1 圖解上述代碼
垃圾回收機制的簡寫
GC能夠找到內存中的垃圾,並釋放和回收空間
GC是一種機制,垃圾回收器完成具體的工做,工做的內容就是查找垃圾釋放空間,回收空間
算法就是工做時查找和回收所遵循的規則
//程序中再也不須要使用的對象 (fn方法) function fn(){ name = "aa" return name } fn() //程序中不能再訪問到的對象 (name) function fn1(){ const name = "aa" return name } fn1()
設置引用數,判斷當前引用數是否爲0
引用計數器:GC經過判斷引用計數器是否爲0判斷是否須要內存回收
優缺點:
function fn2(){ const name = "aa" return name } fn2()//執行完後,函數內name變量的引用計數變成0,fn2所佔的內存被回收釋放 const o = { age:19 } const ls = o.age //o的對象在ls處有引用,o在內存沒法被釋放 //obj1和obj2循環引用 function objGroup(obj1,obj2){ obj1.next = obj2 obj2.prev = obj1 return { o1:obj1, o2:obj2 } }
將垃圾回收操做分紅兩個階段 標記階段和清除階段
- 標記階段:遍歷全部對象(遞歸查找)給活動對象標記
- 清除階段:遍歷全部的對象清除沒有標記對象(看圖內部可能有a1,b1未被標記的私有變量),同時清除全部標記
優缺點:
當釋放的空間內存地址不連續,致使分散再空閒列表的角落,致使下次再使用內存不太適合再使用
標記清除的加強操做,標記階段與標記清除算法一致
整理階段:會在清除以前,先執行整理,移動對象,使釋放的地址連續,再執行清除操做
優缺點:
V8垃圾回收策略
V8中經常使用GC算法
V8內存分配(如圖)
新生代對象回收實現
回收細節說明
V8如何回收老生代對象
老年代對象回收實現
增量標記垃圾回收(如圖)
新老生代對比
總結
我的總結