GC(Garbage Collection)

在垃圾回收领域有一个代际假说的概念,大致意思就是数据分为生命周期短的和长久的。
根据代际假说,v8对堆的数据保存分为 新生代区域老生代区域 两大块。这两区域的垃圾回收是不同的,分别为 副垃圾回收器主垃圾回收器

  • 新生代区域

存储空间小,不能存放大对象

  • 老生代区域

空间大,存活时间长。新生代经过2次GC仍存活的的变量

  • 副垃圾回收器

通过将新生代区域平分为2块区域: 对象区空闲区 。当 活动区 中内存满时启动垃圾回收,遍历对象进行垃圾标记,将 活动 的对象复制到 空闲区 ,移动到 空闲区 的对象是按顺序来的,因此不用去整理。处理完后,将 对象区空闲区 翻转,完成垃圾回收。复制操作需要时间成本,因此为了效率,空间一般设置的很小。空间小,容易填满,因此又采用了 对象晋升策略 ,经过两次垃圾回收依然存活的对象就会被移动到老生区

  • 主垃圾回收器

采用 标记-清除(Mark-Sweep) 的算法进行垃圾回收。解决 标记-清除 空间不连续引入 标记-整理(Mask-Compact) ,标记完后,先将所有存活的对象向一端移动,然后直接清理掉这一端以外的内存。

引用计数类型 (Reference GC)

  • **引用计数(reference-counting)**:每个对象配置一个 计数器 ,用于记录指向该对象的引用个数,GC触发时会回收计数为 0 的对象。

    追溯类型 (Tracing GC)

  • **标记-清除(mark-sweep)**:扫描整个 heap,标出可到达对象,然后执行 sweep 操作回收不可到达对象

  • **标记-压缩(mark-compact)**:扫描整个 heap,标出可到达对象,然后执行 compact(重新安排可达到对象,再更新指向可达对象的指针) 操作回收。
  • **复制(Copying)**:同**stop-copy**,把所有可到达对象移动到一个区域,heap 中剩余的空间全部清除。
  • Non-Copying Implicit

    增量类型 (incremental GC)

  • **垃圾回收的线程**分多个小批次执行。这样每次造成的**应用程序的线程**停顿都很小。

    分代类型(Generational GC)

    对于大多数应用来说,多数对象在创建不久即会成为垃圾。因此,需要针对不同 age 的对象来划分不同区域,并采用不同的回收策略。一般情况下,可以简单的分为两个代:**younger****older**

  • **younger**: 存放活跃的对象,需要经常进行垃圾回收

  • **older**: 存放不活跃的独享,回收频率低。

晋升: 在一定条件下,将处在新生代的对象转移到老生代的过程

V8 GC 触发机制