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如何回收老生代对象
老年代对象回收实现
增量标记垃圾回收(如图)
新老生代对比
总结
我的总结