內(nèi)存管理
內(nèi)存管理: 人為的申請空間、使用空間、釋放空間
整個流程簡化:
1.申請空間 let obj = {}
2.使用空間 obj.name = 'foo'
3.釋放空間 obj = null
垃圾回收及常見的GC算法
- javascript中內(nèi)存管理是自動的
- 對象不再被引用時判斷為垃圾
- 對象不能從根上訪問到時判斷為垃圾
- Javascript中的根可以理解為全局變量對象或作用域
GC就是垃圾回收機(jī)制的簡寫
- GC是一種機(jī)制,垃圾回收器完成具體的工作
- 工作內(nèi)容就是查找垃圾釋放空間、回收空間
- 算法就是工作時查找和回收所遵循的規(guī)則
常見的GC算法
- 引用計數(shù)
- 標(biāo)記清除
- 標(biāo)記整理
- 分代回收
引用計數(shù)
核心思想: 設(shè)置引用數(shù),判斷當(dāng)前引用數(shù)是否為0,引用關(guān)系發(fā)生變化時修改引用數(shù)字昔善,當(dāng)數(shù)字變?yōu)? 的時候就立即回收。
優(yōu)點(diǎn):
- 1.發(fā)現(xiàn)垃圾的時候立即回收
- 2.最大限度上減少程序暫停
缺點(diǎn):
- 1.無法回收循環(huán)引用的對象
- 時間開銷大
標(biāo)記清除
核心思想:
- 遍歷所有對象進(jìn)行標(biāo)記活動對象
- 遍歷所有的對象清除沒有標(biāo)記的對象畔乙,并清除已有標(biāo)記
- 回收相應(yīng)的空間君仆,形成一個可申請空間的鏈表
優(yōu)點(diǎn):
- 1.可以解決對象相互應(yīng)用之間的關(guān)系無法清除的問題
缺點(diǎn):
- 1.空間碎片化,所回收的垃圾的對象空間不連續(xù)
標(biāo)記整理
核心思想:
- 遍歷所有對象進(jìn)行標(biāo)記活動對象
- 清除前會現(xiàn)對對象空間地址進(jìn)行整理牲距,遍歷所有的對象清除沒有標(biāo)記的對象返咱,并清除已有標(biāo)記
優(yōu)點(diǎn):
- 1.減少碎片化空間
缺點(diǎn):
- 1.不能立即回收垃圾對象
V8引擎的垃圾回收機(jī)制
V8是一款主流的Javascript執(zhí)行引擎,V8是即時編譯牍鞠,V8是有內(nèi)存上限的(64位1.5G咖摹,32位800M)。
V8垃圾回收策略
- 采用的是分代回收的思想
- 內(nèi)存分為新生代和老生代
- 針對不同的生代采用不同的算法
- 常用的算法(分代回收难述、空間復(fù)制萤晴、標(biāo)記清除吐句、標(biāo)記整理、標(biāo)記增量)
V8內(nèi)存分配
- V8內(nèi)存一分為二
- 小空間用來存儲新生代對象(32M|16M)
- 新生代指的是存活時間比較短的對象
- 大空間用來存儲老生代對象(1.4G和700M)
- 老生代對象指存活時間較長的對象(全局對象店读、閉包的對象)
新生代的回收:
- 回收過程采用復(fù)制算法和標(biāo)記整理
- 新生代內(nèi)存區(qū)分為兩個等大小的空間
- 使用空間from嗦枢,空閑空間To
- 活動對象存儲在From空間
- 標(biāo)記整理后將活動對象拷貝到To
- From和To交換空間完成釋放
- 回收中的細(xì)節(jié)說明(1.拷貝過程中可能出現(xiàn)晉升。2.晉升就是將新生代對象移動到老生代屯断。3.一輪GC還存活的就需要晉升文虏。4.To空間的使用率超過25%的時候也需要晉升)
老生代的回收:
- 主要采用的是標(biāo)記清除、標(biāo)記整理裹纳、增量標(biāo)記算法
- 首先使用的是標(biāo)記清除完成垃圾空間的回收
- 在晉升時空間不足時择葡,會采用標(biāo)記整理操作
- 采用增量標(biāo)記的方法進(jìn)行效率提升
Performance工具的使用(內(nèi)存監(jiān)控)
- GC的目的就是為了實現(xiàn)內(nèi)存空間的良性循環(huán)
- performance可以監(jiān)控內(nèi)存變化情況
基本使用:
- 打開瀏覽器進(jìn)入開發(fā)工具面板
- 選擇性能紧武,開啟錄制功能剃氧,訪問具體頁面
- 執(zhí)行用戶行為,一段時間停止錄制
- 分析界面中記錄的內(nèi)存信息
內(nèi)存問題的外在表現(xiàn)
- 頁面出現(xiàn)延遲加載或經(jīng)常性暫停
- 頁面持續(xù)出現(xiàn)糟糕的性能
- 頁面的性能隨時間的延長越來越差
幾種常見的內(nèi)存監(jiān)控方式
- 瀏覽器任務(wù)管理器
- Timeline時序圖記錄
- 堆快照查找分離DOM
- 判斷是否存在頻繁的垃圾回收