内存管理介绍:
- 内存:由可读写单元组成,表示一片可操作哦空间。
- 管理:人为的去操作一片空间的申请、使用和释放。
- 内存管理:开发者主动申请空间、使用空间、释放空间。
- 管理流程:申请——使用——释放
JavaScript的垃圾回收:JavaScript中内存管理是自动的,对象不再被引用时是垃圾,对象不能从根*问到时是垃圾会被自动回收。
JavaScript中的可达对象:可以访问到的对象就是可达对象(引用、作用域链),可大的标准就是从根触发是否能够被找到,JavaScript中的根就可以理解为是全局变量对象。
GC算法:GC垃圾回收机制的简写,可以找到内存中的垃圾、并释放和回收空间。是一种机制,垃圾回收器完成具体的工作。
工作内容就是查找垃圾释放空间、回收空间。
算法就是工作时查找和回收所遵循的规则。
GC的垃圾:1、程序不再需要使用的对象。2、程序中不能再访问到的对象。
常见GC算法:引用计数、标记清除、标记整理、分代回收、
引用计数:核心思想:设置引用数,判断当前引用数是否为0。引用计数器,引用关系改变时修改引用数字。
优点:发现垃圾时立即回收,最大限度减少程序暂停。缺点:无法回收循环引用的对象,时间开销大。
标记清除算法:分标记和清除两个阶段完成。1、遍历所有对象标记活动对象2、遍历所有对象清除没有标记对象并抹去上次标记,回收相应的空间。
标记清楚算法优点:可以回收循环引用的对象,缺点,由于内存地址不连续,回收之后,空间碎片化;不会立即回收垃圾对象,清除时当前程序停止工作。
标记整理算法:可以看做是标记清除的增强。标记阶段的操作与标记清除一致,清除阶段会先执行整理,移动对象位置。
优点减少碎片化空间,缺点不会立即回收垃圾对象、
v8垃圾回收策略:采用分代回收的思想,内存分为新生代、老生代,针对不同对象采取不同算法。
v8常用的GC算法:分代回收,空间复制、标记清除、标记整理、标记增量。
v8如何回收新生代对象
v8内存(64位1.5G,32位800M)分配:
v8内存空间一分为二:小空间用于存储新生代对象(32M64位操作系统|16M32位操作系统)
新生代对象指的是存活时间较短的对象
新生代对象回收机制
回收对象采用复制算法+标记整理
新生代内存区分为两个等大小空间:使用空间from,空闲空间为To
活动对象存储于From空间
标记整理过后将活动对象拷贝到To空间
Form与To交换空间完成释放
回首细节说明:
拷贝过程中可能出现晋升存储到老生代存储区,(晋升是将新生代对象移动到老生代:两种情况,一代GC还存活的新生代需要晋升,To空间使用率超过25%)
如何回收老生代对象垃圾(64位1.4G,32位700M)老生代指存活时间较长的对象
主要采用标记清除、标记整理、增量标记算法
首先使用标记清除完成垃圾空间的回收(因为快啊)
采用标记整理进行空间优化,当新生代区域内容移动到老生代区域,且老生代存储区域空间不足存储该内容,触发标记整理。
采用增量标记进行效率优化。
新生代区域垃圾回收使用空间换时间,老年代区域打击回收不适合复制算法。
标记增量把一整段垃圾回收操作拆分为多个步骤完成。
为什么使用performance?
GC的目的是为了实现内存使用空间的良性循环,良性循环的基石是合理使用,时刻关注才能确定是否合理,而performance提供多种检测方式。
通过performance时刻监控内存。
内存问题的体现:1、页面出现延迟加载或经常性暂停2、页面持续性出现糟糕的性能3、页面的性能随时间延长越来越差
界定内存问题的标准:1、内存泄漏:内存使用持续升高2、内存膨胀:在多数设备上都存在性能问题3、频繁垃圾回收,通过内存变化图分析。
监控内存的几种方式:1、浏览器任务管理器(sheft+esc)2、Timeline时序图记录3、堆快照分离DOM4、判断是否存在频繁的垃圾回收
堆快照分离DOM
堆快照原理:留存当前js堆,照片留存,获取堆信息,分离DOM。
垃圾对象时的DOM节点,分离状态的DOM节点
界面元素存活在DOM树上同时代码也没有引用
界面元素脱离DOM树上,但代码还在引用
判断是否存在频繁垃圾回收
为何要判断1、GC工作时应用程序是停止的2、频繁且过长的GC会导致应用假死3、用户使用中感知应用卡顿
如何判断1、Timeline中频繁上升下降2、任务管理器中数据频繁的增加减小
如何精准测试JavaScript的性能
Jsperf使用流程:使用github账号登录 、填写测试用例信息、填写准备代码、填写必要有setup与teardown代码、填写测试代码片段
1、缓存变量 2=选择合适的循环方式3、文档碎片化统一插入DOM document.createDocumentFragment
4、克隆优化节点操作5、克隆优化节点操作6、直接量替换 new Object
JSbench性能测试网站
代码性能优化
1、减少判断层级、作用域链查找层级、数据读取次数
2、字面量与构造式3、减少循环体中活动 4、减少声明和语句数
js中经常使用字面量、局部变量、数组元素、对象属性。字面量、局部变脸速度快(直接存放于栈中)