javaScript 性能优化

439 阅读4分钟

as### 概要

  1. 内存管理
  2. 垃圾回收与常见的GC算法
  3. V8引擎的垃圾回收
  4. performance 工具
  5. 代码优化实例

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
  • 判断是否存在频繁的垃圾回收

任务管理器监视内存