内存管理
内存管理介绍
- 内存:由可读写单元组成,表示一片可操作性空间
- 管理:认为的去操作一片空间的申请、使用和释放
- 内存管理:开发者主动申请空间、使用空间、释放空间
- 管理流程:申请——使用——释放
js 中的内存管理
- 申请内存空间
- 使用内存空间
- 释放内存空间
垃圾回收 、 常见的 GC 算法
js 中的垃圾
- js 中内存管理是自动的
- 对象不再被引用时是垃圾
- 对象不能从根上访问到时事垃圾
js 中的可达对象
- 可以访问到的对象就是可达对象(引用、作用域链)
- 可达的标准就是从根出发是否能够被找到
- js 中的根就是可以理解为全局变量对象
GC 定义与作用
- GC 就是垃圾回收机制的简写
- GC 可以找到的内存中的垃圾、并释放和回收空间
GC 里的垃圾 1.程序中不再需要使用的对象 2.程序中不能再访问到的对象
GC 算法是什么
-
GC 是一种机制,垃圾回收器完成具体的工作
-
工作的内容就是查找垃圾释放空间、回收空间
-
算法就是工作时查找和回收所遵循的规则 场景的 GC 算法
-
引用计数
-
核心思想:设置引用数,判断当前引用数是否为 0
-
引用计数器
-
引用关系改变时修改引用数字
-
引用数字为 0 时立即回收
优点 :1.发现垃圾立即回收 2.最大限度减少程序暂停 缺点 :1.无法回收循环引用的对象 2.时间开销大
-
标记清除
-
核心思想:分标记和清楚两个阶段完成
-
遍历所有对象找编辑活动对象
-
遍历对象清除没有标记对象
-
回收响应空间
优点:1.可以解决对象循环引用不能回收的问题 缺点:1,空间的碎片化,不能让空间得到最大化的使用 2.不能立即回收垃圾对象
-
标记整理
-
标记清除的增强
-
标记阶段的操作和标记清除一致
-
清除阶段会先执行整理,移动对象位置
优点 减少碎片化空间 缺点 不会立即回收垃圾对象
- 分代回收
-
V8 引擎的垃圾回收
- js 主流执行引擎
- v8 采用及时编译
- v8 内存设限制 --1.5g
V8 垃圾回收策略
-
采用分带回收的思想
-
内存分为新生代、老生代
V8 中常用的 GC 算法
-
分带回收
-
空间复制
-
标记清除
-
标记整理
-
标记增量
v8 内存分配
-
v8 内存空间一分为二
-
小空间用于储存新生代对象(32M|16M)
-
新生带指的是存活时间较短的对象
新生代对象回收实现
-
回收过程采用复制算法 + 标记整理
-
新生代内存区分为两个等大小空间
-
使用空间为 From,空闲空间为 To
-
活动对象储存于 From 空间
-
标记整理后讲活动对象拷贝至 To
-
From 与 To 交换空间完成释放
回收细节说明
-
拷贝过程中可能出现晋升
-
晋升就是将新生代对象移动至老声带
-
一轮 GC 还存活的新生代需要晋升
-
To 空间使用率超过 25%
老生代对象说明
-
老生代对象存放在右侧老生代区域
-
64 位操作系统 1.4G 32 操作系统 700m
-
老生代对象就是指存活时间较长的对象
老年代对象回收实现
-
主要采用标记清除、标记整理、增量标记算法
-
首先使用标记清除完成垃圾空间的回收
-
采用标记整理进行空间优化
-
采用增量标记进行效率优化
细节对吧
-
新生代区域垃圾回收使用空间换时间
-
老生代区域垃圾回收不适合复制算法
界定内存问题的标准
-
内存泄漏:内存使用持续升高
-
内存膨胀:在多数设备上都存在性能问题
-
频繁的垃圾回收:通过内存变化图进行分析
监控内存的几种方式
- 浏览器任务管理器
- Timeline 时序图吉利
- 堆块查找分类 Dom
- 判断是否存在频繁的垃圾回收
-
performance 工具
代码优化实例
- 慎用全局变量
- 缓存全局变量
- 通过原型对象添加附加方法
- 避开闭包陷阱
- 避免属性访问方法使用
- For循环优化 let i = 0 ; len=arr.length-1 ;i<len;i++
- 选择最优的循环方法
- 优化节点添加
- 克隆优化节点添加
- 直接量替换Object
js性能优化
- 减少判断层级
- 减少作用域链查找层级
- 减少数据读取次数
- 字面量与构造式
- 减少循环体中活动
- 减少声明语句数
- 惰性函数与性能
- 采用事件绑定