目录
1、GC定义与作用
- GC(Garbage Collection)就是垃圾回收机制的简写
- GC可以找到内存中的垃圾、并释放和回收空间
2、GC里的垃圾是什么
- 程序中不再需要使用的对象
- 程序中不再能访问到的对象
3、GC算法是什么
- GC是一种机制,垃圾回收器完成具体的工作
- 工作的内容就是查找垃圾释放空间、回收空间
- 算法就是工作时查找和回收所遵循的规则
4、常见的GC算法
-
引用计数
实现工作原理
-
核心思想:设置引用数,判断当前引用数是否为0
-
引用计数器
-
引用关系改变时修改引用数字
-
引用数字为0时立即回收
优点
- 发现垃圾时立即回收
- 最大限度减少程序暂停
缺点
- 无法回收循环引用的对象
- 时间开销大
-
标记清除
实现工作原理
-
核心思想:分标记和清除二哥阶段完成
-
遍历所有对象找标记活动对象
-
遍历所有对象清除没有标记对象
-
回收相应的空间
优点
- 发现垃圾时立即回收
缺点
- 容易产生碎片化空间
- 不会立即回收垃圾对象
-
标记整理
实现工作原理
-
标记整理可以看做是标记清除的增强
-
标记阶段的操作和标记清除一致
- 清除阶段会限制性整理,移动对象位置
优点
- 减少碎片化空间
缺点
- 不会立即回收垃圾对象
- 移动对象位置,回收效率慢
- 分代回收(V8 垃圾回收策略)
5、认识V8
- 什么是 V8
- V8 是一款主流的 JavaScript 执行引擎
- V8 采用即时编译
- V8 内存设限:64位操作系统不超过1.5G;32位操作系统不超过800M
- V8 垃圾回收策略
- 采用分代回收的思想
- 内存分为新生代、老生代
- 针对不同对象采用不同算法
- V8 内存分配
- V8内存一分为二
- 小空间用于存储新生代对象(32M | 16M)
- 新生代指的是存活时间较短的对象
- 新生代对象回收实现
- 回收过程采用赋值算法 + 标记整理
- 新生代内存区分为二个等大小空间
- 使用空间为 From, 空闲空间为 To
- 活动对象存储于 From空间
- 标记整理后将活动对象拷贝至 To
- From 与 To 交换空间完成释放
回收细节说明:
- 拷贝过程中可能出现晋升
- 晋升就是讲新生代对象移动至老生代
- 一轮GC 还存活的新生代需要晋升
- To 空间的使用率超过25%
- 老生代对象回收实现
老生代对象说明
- 老生代对象存放在右侧老生代区域
- 64位操作系统 1.4G,32操作系统 700M
- 老生代对象就是指存活时间较长的对象
- 老生代对象回收实现
- 主要采用标记清楚、标记整理、增量标记算法
- 首先使用标记清楚完成垃圾空间的回收
- 采用标记整理进行空间优化
- 采用增量标记进行效率优化
- 细节对比
- 新生代区域垃圾回收使用空间换时间
- 老生代区域垃圾回收不适合赋值算法
6、内存问题的体现
- 页面出现延迟加载或经常性暂停
- 页面持续出现糟糕的性能
- 页面的性能随时间延长越来越差
7、监控内存的几种方式
- 浏览器任务管理器
- Timeline 时序图记录
- 堆快照查找分离 DOM
- 判断是否存在频繁的垃圾回收
版权声明:本文为weixin_37883657原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。