GC(Garbage Collection)算法介绍(前端小常识)

  • Post author:
  • Post category:其他



目录


1、GC定义与作用


2、GC里的垃圾是什么


3、GC算法是什么


4、常见的GC算法


5、认识V8


6、内存问题的体现


7、监控内存的几种方式

1、GC定义与作用

  • GC(Garbage Collection)就是垃圾回收机制的简写
  • GC可以找到内存中的垃圾、并释放和回收空间

2、GC里的垃圾是什么

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

3、GC算法是什么

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

4、常见的GC算法

  • 引用计数


    实现工作原理

  1. 核心思想:设置引用数,判断当前引用数是否为0

  2. 引用计数器

  3. 引用关系改变时修改引用数字

  4. 引用数字为0时立即回收


优点

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


缺点

  1. 无法回收循环引用的对象
  2. 时间开销大
  • 标记清除


    实现工作原理

  1. 核心思想:分标记和清除二哥阶段完成

  2. 遍历所有对象找标记活动对象

  3. 遍历所有对象清除没有标记对象

  4. 回收相应的空间


优点

  1. 发现垃圾时立即回收


缺点

  1. 容易产生碎片化空间
  2. 不会立即回收垃圾对象
  • 标记整理


    实现工作原理

  1. 标记整理可以看做是标记清除的增强

  2. 标记阶段的操作和标记清除一致

  3. 清除阶段会限制性整理,移动对象位置



优点

  1. 减少碎片化空间

缺点

  1. 不会立即回收垃圾对象
  2. 移动对象位置,回收效率慢
  • 分代回收(V8 垃圾回收策略)

5、认识V8

  • 什么是 V8
  1. V8 是一款主流的 JavaScript 执行引擎
  2. V8 采用即时编译
  3. V8 内存设限:64位操作系统不超过1.5G;32位操作系统不超过800M
  • V8 垃圾回收策略
  1. 采用分代回收的思想
  2. 内存分为新生代、老生代
  3. 针对不同对象采用不同算法

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

  • 新生代对象回收实现
  1. 回收过程采用赋值算法 + 标记整理
  2. 新生代内存区分为二个等大小空间
  3. 使用空间为 From, 空闲空间为 To
  4. 活动对象存储于  From空间
  5. 标记整理后将活动对象拷贝至 To
  6. From 与 To 交换空间完成释放

回收细节说明:

  1. 拷贝过程中可能出现晋升
  2. 晋升就是讲新生代对象移动至老生代
  3. 一轮GC 还存活的新生代需要晋升
  4. To 空间的使用率超过25%
  • 老生代对象回收实现

老生代对象说明

  1. 老生代对象存放在右侧老生代区域
  2. 64位操作系统 1.4G,32操作系统 700M
  3. 老生代对象就是指存活时间较长的对象
  • 老生代对象回收实现
  1. 主要采用标记清楚、标记整理、增量标记算法
  2. 首先使用标记清楚完成垃圾空间的回收
  3. 采用标记整理进行空间优化
  4. 采用增量标记进行效率优化
  • 细节对比
  1. 新生代区域垃圾回收使用空间换时间
  2. 老生代区域垃圾回收不适合赋值算法

6、内存问题的体现

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

7、监控内存的几种方式

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



版权声明:本文为weixin_37883657原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。