# V8垃圾回收机制

# 开始前的名词解释环节

# 代际假说和分代收集

  • 首先明确一点 代际假说是一个非常关键的概念 它是垃圾回收策略的相关基础

  • 代际假说有两个特点

      1. 大部分对象在内存中的存活时间非常短 简单来说就是 对象一经内存分配 很快就会无法访问
      1. 可以持续访问的对象(不死的对象) 存活时间较长

口头描述是不是感觉比较生涩难以理解 但是没关系 我们先记住这两个特点 并且我们基于这两个特点 来一起看看 V8是如何实现垃圾回收机制的

  • 新生代老生代

      1. 新生代 用于存放在内存中存活时间比较短的对象
      1. 老生代 用于存放在内存中存活时间比较长的对象
      1. 同时 V8基于新生代 对应一个副垃圾回收器老生代对应一个主垃圾回收器
  • 垃圾回收的执行流程

    • 不论主垃圾回收器还是副垃圾回收器 他们都有一个统一的执行过程

      1. 标记活动对象非活动对象 前者的名词解释其实就是 还在使用的对象 后者的名词解释就是 可以进行垃圾回收的对象
      1. 对于非活动对象所占据对内存 进行一次回收 (垃圾清理)
      1. 内存整理 我们都知道内存是一块连续的分配空间 当多次进行垃圾回收以后 这块连续的内存空间会被变得不连续 那么就会产生内存碎片 不过这一步并不是必须的 同时在上文提到的副垃圾回收器并不会产生内存碎片
  • 有了上述的名词解释基础以后 我们一起来看看副垃圾回收器是如何工作的吧

# 副垃圾回收器工作流(scavenge算法)

  • 基于scavenge算法 副垃圾回收器把新生区对半分为了 对象空间空闲空间 而所有的新对象都会被添加到对象空间里 同时 当对象空间快被填满的时候就会触发垃圾回收的前置条件

  • # 回收过程

      1. 标记活动对象和非活动对象
      1. 活动对象复制到空闲区域中 同时有序排列所有的存活对象 这里的有序排列正好解释了为什么副垃圾回收器不会产生内存碎片
        (一块连续的内存空间被分割以后就会产生内存碎片 而副垃圾回收器在复制完活动对象以后 对所有的对象进行了一次排序 那么内存会重新归于连续状态)
      1. 空闲区域对象区域做一次角色翻转 也就是两者角色兑换 也正是因为这个机制 在新生区中 这两个区域可以无限次使用 脑补一下翻转过程 翻转以后此时的空闲区域非活动对象填充 对象区域仅剩下活动对象 所以 也就完成了垃圾回收
      1. 翻转以后即完成垃圾回收

    具体的回收过程 可以参考下图 副垃圾器回收流程