8-javascript优化GC V8引擎(01-02-05)

337 阅读3分钟

javascript

GC

js内存管理

  • 申请内存空间
  • 使用内存空间
  • 释放内存空间

js的垃圾

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

GC的垃圾是什么

  • 程序中不再需要使用的对象
  • 程序中不能再访问到的对象

GC算法

  • GC是一种机制,垃圾回收器完成具体的工作
  • 工作的内容就是查找垃圾释放空间、回收空间
  • 算法就是工作时查找和回收所遵循的规则

引用计数算法

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

引用计数算法缺点

  • 无法回收循环引用的对象
  • 时间开销大

标记清除算法

  • 标记和清除二个步骤
  • 遍历所有对象找标记活动对象
  • 遍历对象清除没有标记的对象

标记清除算法的优缺点

  • 可以回收循环引用的对象
  • 容易产生碎片化空间、浪费空间

标记整理优缺点

  • 减少碎片空间
  • 移动位置,回收效率慢

V8

  • v8是JavaScript执行引擎
  • v8采用即时编译
  • v8内存设限

V8垃圾回收策略

  • 采用分代回收的思想
  • 内存分为新生代、老生代
  • 针对不同对象采用不同算法

V8中常用GC算法

  • 分代回收
  • 空间复制
  • 标记清除
  • 标记整理
  • 标记增量

新生代

  • 大多数的对象被分配在这里,这个区域很小但是垃圾回特别频繁。
  • 使用空间FROM,空闲空间To
  • 活动对象存储在From
  • 标记整理后将活动对象拷贝到To
  • From和To交换空间完成释放

老年代对象

  • 指的是存活时间较长的对象
  • 主要采用标记清除、标记整理、增量标记
  • 首先用标记清除完成回收
  • 采用标记整理采用空间优化
  • 采用增量标记进行效率优化

V8总结

  • V8是一款主流的JavaScript执行引擎
  • V8内存设置上限
  • V8采用基于分代回收思想实现垃圾回收
  • V8内存分为新生代和老生代
  • V8垃圾回收常见的GC算法

Performance工具

监控页面的各种性能

步骤

  • 打开浏览器输入目标网址
  • 进入开发人员工具面板,选择性能
  • 幵启录制功能,访问具体界面
  • 执行用户行为,一段时间后停止录制

内存问题的外在表现

  • 页面出现延迟加载或经常性暂停
  • 页面持续性出现糟糕的性能
  • 页面的性能随时间延长越来越差

界定内存问题的标准

  • 内存泄露:内存使用持续升高
  • 内存膨胀:在多数设备上都存在性能问题
  • 频繁垃圾回收:通过内存变化图进行分析

监控内存的几种方式

  • 浏览器任务管理器
  • Timeline时序图记录
  • 堆快照查找分离DOM
  • 判断是否存在频繁的垃圾回收

为什么确定频繁垃圾回收

  • GC工作时应用程序是停止的
  • 频繁且过长的GC会导致应用假死
  • 用户使用中感知应用卡顿