as### 概要
- 内存管理
- 垃圾回收与常见的GC算法
- V8引擎的垃圾回收
- performance 工具
- 代码优化实例
javaScript 内存管理(memory management)
内存管理介绍
- 内存:由可读写单元组成,表示一片可操作控件
- 管理:人为的去操作一片空间的申请,使用和释放
- 内存管理:开发者主动申请控件,使用控件,释放控件
- 管理流程: 申请->使用->释放
javaScript 的内存管理
- 申请内存空间
- 使用内存控件
- 释放内存控件
// 申请
let obj = {}
// 使用
obj.name = 'lg'
// 释放
obj = null
javaScirpt 垃圾回收
- javaScript 中内存管理是自动的
- 对象不再引用时是垃圾
- 对象不能从根上访问到时是垃圾
javaScript 中的可达对象
- 可以访问到的对象就是可达对象 (引用,作用域链)
- 可达的标准就是从根上出发是否能够被找到
- javaScript 中的根就可以理解为是全局变量对象
javaScript 中的引用与可达
GC 算法
GC 定义和作用
- GC 就是垃圾回收机制的简写
- GC 可以找到内存中的垃圾,并释放和回收空间
GC 里的垃圾是什么
-
程序中不需要使用的对象
-
程序中不能再访问到的对象
GC 算法是什么
- GC 是一种机制,垃圾回收器完成具体的工作
- 工作的内容就是查找垃圾释放控件,回收控件
- 算法就是工作时查找和回收所遵循的规则
常见的 GC 算法
- 引用计数
- 标记清除
- 标记整理
- 分代回收
引用计数算法实现原理
引用计数算法
- 核心思想: 设置引用数,判断当前引用数是否为0
- 引用计数器
- 引用关系改变时修改引用数字
- 引用数字为 0 是立即回收
引用计数算法优点
- 发现垃圾时立即回收
- 最大限度减少程序暂停
引用计数算法缺点
- 无法回收循环引用的对象
- 时间开销大
标记清除算法实现原理
标记清除算法
- 核心思想: 分标记和清除二个阶段完成
- 遍历所有对象找标记活动对象
- 遍历所有对象清除没有标记对象
- 回收相应的空间
常见GC 算法总结
V8 引擎
- V8是一款主流的 JavaScript 执行引擎
- V8 采用即时编译
- V8 内存设限
V8 内存分配
- V8 内存控件 一分为二
- 小空间用于存储新生代对象(32M | 16M)
- 新生代对象指的是存活时间较短的对象
新生代对象回收实现
- 回收过程采用复制算法 + 标记整理
- 新生代内存区分为二个等大小空间
- 使用空间为 from , 空闲空间为 to
- 活动对象存储于 from 空间
- 标记整理后将活动对象拷贝至 To
- From 与 To 交换空间完全释放
为什么使用 Performance
- GC 的目的是为了实现内存空间的良性循环
- 良性循环的基石是合理使用
- 时刻关注才能确定是否合理
- Performance 提供多种监控方式
Performance 使用步骤
- 打开浏览器输入目标网址
- 进入开发这工具面板, 选择性能
- 开启录制功能访问具体界面
- 执行用户行为,一段时间后停止录制
- 分析结果
内存问题的外在体现
- 页面出现延迟加载或者经常性暂停
- 页面持续性出现糟糕的性能
- 页面的性能随着时间延长越来越差
监控内存的几种方式
界定内存问题的标准
- 内存泄露, 内存使用持续升高
- 内存膨胀,在多数设备上都存在性能问题
- 频繁垃圾回收: 通过内存变化图进行分析
监控内存的几种方式
- 浏览器的任务管理器
- Timeline 的时序图记录
- 堆块照查找分离的 DOM
- 判断是否存在频繁的垃圾回收