JS性能优化

性能优化介绍

  1. 性能优化是不可避免的
  2. 哪些内容可以看做是性能优化
  3. 无处不在的前端性能优化

内存管理
垃圾回收与常见 GC 算法
V8 引擎的垃圾回收
Performance 工具
代码优化实例

内存管理 Memory Management

内存管理介绍
内存:由可读写单元组成,表示一片可操作空间
管理:人为的去操作一片空间的申请、使用和释放
内存管理:开发者主动申请空间、使用空间、释放空间
管理流程:申请 – 使用 – 释放

JavaScript中的内存管理

  • 申请内存空间
  • 使用内存空间
  • 释放内存空间
// 申请
let obj = {
   }

// 使用
obj.name = 'lg'

// 释放
obj = null

JavaScript 中的垃圾回收

JavaScript 中的垃圾

  • JavaScript 中内存管理是自动的
  • 对象不再被引用时是垃圾
  • 对象不能从根上访问到时是垃圾

JavaScript 中的可达对象

  • 可以访问到的对象就是可达对象(引用、作用域链)
  • 可达的标准就是从根出发是否能够被找到
  • JavaScript 中的根就可以理解为是全局变量对象

GC算法介绍

  • GC 就是垃圾回收机制的简写

  • GC可以找到内存中的垃圾、并释放和回收空间
    GC里的垃圾是什么

  • 程序中不再需要使用的对象

  • 程序中不能再访问到的对象
    GC算法是什么

  • GC是一种机制,垃圾回收器完成具体的工作

  • 工作的内容就是查找垃圾释放空间、回收空间

  • 算法就是工作时查找和回收所遵循的

常见GC算法

  • 引用算法
  • 标记清除
  • 标记整理
  • 分代回收

引用计数算法实现原理

引用计数算法

  • 核心算法:设置引用数,判断当前引用数是否为0
  • 引用计数器
  • 引用关系改变时修改引用数字
  • 引用数字为0时立即回收

引用计数算法优缺点

引用计数算法优点

  • 发现垃圾时立即回收
  • 最大限度减少程序暂停

引用计数算法缺点

  • 无法回收循环引用的对象
  • 时间开销大(资源消耗大)

标记清除算法实现原理

标记清除算法

  • 核心思想:分标记和清除二个阶段完成
  • 遍历所有对象找标记活动对象
  • 遍历所有对象清除没有标记对象
  • 回收相应的空间
    在这里插入图片描述

标记清除算法优缺点

标记清除算法优点:

  • 相对计数算法来说可以解决无法回收循环引用的对象的问题(可以回收循环引用的对象)
    在这里插入图片描述

标记清除算法缺点:

  • 相对之前的垃圾回收来说它会产生一个空间碎片化的问题。不能让我们的空间得到最大的使用(容易产生碎片化空间,浪费空间)
  • 不会立即回收垃圾对象
    在这里插入图片描述

标记整理算法实现原理

  • 标记整理可以看做是标记清除的增强
  • 标记阶段的操作和标记清除一致
  • 清除阶段会先执行整理,移动对象位置
    在这里插入图片描述在这里插入图片描述在这里插入图片描述标记整理的优缺点
    优点:

    减少碎片化空间
    缺点:
    不会立即回收垃圾对象

常见GC算法总结

  • 引用计数
  • 标记清除
  • 标记整理

认识V8

  • V8是一款主流的JavaScript执行引擎
  • V8采用即时编译
  • V8内存设限(64位操作系统不超过 1.5G,32位不超过800M)

V8垃圾回收策略

  • 采用分代回收的思想
  • 内存分为新生代、老生代
  • 针对不同对象采用不同算法
    在这里插入图片描述V8中常用GC算法
  • 分代回收
  • 空间复制
  • 标记清除
  • 标记整理
  • 标记增量

V8如何回收新生代对象

V8内存分配
在这里插入图片描述

  • V8 内存空间一分为二
  • 小空间用于储存新生代对象(32M | 16M)
  • 新生代指的是存活时间较短的对象

新生代对象回收实现

  • 回收过程采用复制算法 + 标记整理
  • 新生代内存区分为两个等大小空间
  • 使用空间为From,空闲空间为To
  • 活动对象储存于From空间
  • 标记整理后将活动对象拷贝至To
  • From与To交换空间完成释放

回收细节说明

  • 拷贝过程中可能出现晋升
  • 晋升即时将新生代对象移动至老生代
  • 一轮GC还存活的新生代需要晋升
  • To空间的使用率超过25%(因为在将来进行回收的时候最终要将From 和 To进行一个轮换也就是说以前的To会变成From,From会变成To,To的使用率超过了一定的限制,那将来它变成使用状态时,新进来的对象空间好像就不怎么够用了)

V8如何回收老生代对象

  • 老年代对象存放在右侧老生代区域
  • 64位操作系统1.4G,32操作系统700M
  • 老年代对象就是指存活时间较长的对象(全局变量下所存放的一些对象,闭包里放的一些数据)

老年代对象回收实现

  • 主要采用标记清除、标记整理、增量标记算法
  • 首先使用标记清除完成垃圾空间的回收
  • (空间不足的时候)采用标记整理进行空间优化
  • 最后采用增量标记进行效率优化

细节对比

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值