内存管理
内存管理: 人为的申请空间、使用空间、释放空间
整个流程简化:
1.申请空间 let obj = {}
2.使用空间 obj.name = 'foo'
3.释放空间 obj = null
垃圾回收及常见的GC算法
- javascript中内存管理是自动的
- 对象不再被引用时判断为垃圾
- 对象不能从根上访问到时判断为垃圾
- Javascript中的根可以理解为全局变量对象或作用域
GC就是垃圾回收机制的简写
- GC是一种机制,垃圾回收器完成具体的工作
- 工作内容就是查找垃圾释放空间、回收空间
- 算法就是工作时查找和回收所遵循的规则
常见的GC算法
- 引用计数
- 标记清除
- 标记整理
- 分代回收
引用计数
核心思想: 设置引用数,判断当前引用数是否为0,引用关系发生变化时修改引用数字,当数字变为0 的时候就立即回收。
优点:
- 1.发现垃圾的时候立即回收
- 2.最大限度上减少程序暂停
缺点:
- 1.无法回收循环引用的对象
- 时间开销大
标记清除
核心思想:
- 遍历所有对象进行标记活动对象
- 遍历所有的对象清除没有标记的对象,并清除已有标记
- 回收相应的空间,形成一个可申请空间的链表
优点:
- 1.可以解决对象相互应用之间的关系无法清除的问题
缺点:
- 1.空间碎片化,所回收的垃圾的对象空间不连续
标记整理
核心思想:
- 遍历所有对象进行标记活动对象
- 清除前会现对对象空间地址进行整理,遍历所有的对象清除没有标记的对象,并清除已有标记
优点:
- 1.减少碎片化空间
缺点:
- 1.不能立即回收垃圾对象
V8引擎的垃圾回收机制
V8是一款主流的Javascript执行引擎,V8是即时编译,V8是有内存上限的(64位1.5G,32位800M)。
V8垃圾回收策略
- 采用的是分代回收的思想
- 内存分为新生代和老生代
- 针对不同的生代采用不同的算法
- 常用的算法(分代回收、空间复制、标记清除、标记整理、标记增量)
V8内存分配
- V8内存一分为二
- 小空间用来存储新生代对象(32M|16M)
- 新生代指的是存活时间比较短的对象
- 大空间用来存储老生代对象(1.4G和700M)
- 老生代对象指存活时间较长的对象(全局对象、闭包的对象)
新生代的回收:
- 回收过程采用复制算法和标记整理
- 新生代内存区分为两个等大小的空间
- 使用空间from,空闲空间To
- 活动对象存储在From空间
- 标记整理后将活动对象拷贝到To
- From和To交换空间完成释放
- 回收中的细节说明(1.拷贝过程中可能出现晋升。2.晋升就是将新生代对象移动到老生代。3.一轮GC还存活的就需要晋升。4.To空间的使用率超过25%的时候也需要晋升)
老生代的回收:
- 主要采用的是标记清除、标记整理、增量标记算法
- 首先使用的是标记清除完成垃圾空间的回收
- 在晋升时空间不足时,会采用标记整理操作
- 采用增量标记的方法进行效率提升
Performance工具的使用(内存监控)
- GC的目的就是为了实现内存空间的良性循环
- performance可以监控内存变化情况
基本使用:
- 打开浏览器进入开发工具面板
- 选择性能,开启录制功能,访问具体页面
- 执行用户行为,一段时间停止录制
- 分析界面中记录的内存信息
内存问题的外在表现
- 页面出现延迟加载或经常性暂停
- 页面持续出现糟糕的性能
- 页面的性能随时间的延长越来越差
几种常见的内存监控方式
- 浏览器任务管理器
- Timeline时序图记录
- 堆快照查找分离DOM
- 判断是否存在频繁的垃圾回收
网友评论