V8引擎垃圾回收

# 什么是垃圾回收

垃圾回收(Garbage Collection, 简称GC),简单一点来说就是将不再需要使用的变量所占用的内存释放掉的过程就叫做垃圾回收!

# V8是什么

V8 是由谷歌收购并使用C++开发并开源的javascript虚拟机引擎,运用于Chrome浏览器,还有我们熟知的node。 它将内存分为新生代(new space)与老生代(old space)两个区域

# 新生代(new space)

  • 特点

    1. 新生代(32 位系统分配 16M 的内存空间,64 位系统分配 32M 的内存空间)
    2. 新生代存的都是生存周期短的对象,当存储空间快要满时,就进行一次垃圾回收
  • 回收算法
    采用Scavenge垃圾回收算法,将内存一分为二,一块处于使用状态(from space),一块处于闲置状态(to space)
    具体过程如下:

    1. 检测到存储空间快要满时,开始进行垃圾回收
    2. 对from space开始检查,对于存活对象直接复制到to space
    3. 清空from space中的数据,同时将from space置为空闲状态,即变成to space,对应的to space变成from space,这个过程称为翻转
    4. 重复第一步到第三步

# 新生代晋升

对象从新生代移动到老生代的过程叫作晋升
对象晋升的条件主要有两个:

  • 如果一个对象是第二次经历从from空间复制到to空间,那么这个对象会被移动到老生代中
  • 当要从from空间复制一个对象到to空间时,如果to空间已经使用了超过25%,则这个对象直接晋升到老生代中

# 老生代(old space)

  • 特点
    1. 老生代( 32 位操作系统分配大约 700M 内存空间,64 位操作系统分配大约 1.4G 内存空间)
    2. 老生代中的对象为存活时间较长或常驻内存的对象
  • 回收算法
    • 标记清除(Mark-Sweep)
      1. 标记阶段:对于存活对象进行标记
      2. 清除阶段:清除没有被标记的对象
        存在的问题就是在进行一次清除回收以后,内存空间会出现不连续的状态。这种内存碎片会对后续的内存分配造成问题。
    • 标记整理(Mark-Compact)
      1. 标记阶段:对于存活对象进行标记
      2. 整理阶段:将所有存活对象向内存空间的一侧移动
      3. 清除阶段:将边界另一侧的内存一次性全部回收
  • 策略
    V8主要使用Mark-Sweep,在空间不足以对从新生代中晋升过来的对象进行分配时,才使用Mark-Compact

# 参考文章