Follow me on GitHub

为什么需要“分代回收”算法?

前面介绍了 3 种垃圾回收算法:

  • 复制
  • 标记-清除
  • 标记-整理

它们适合的场景不同,例如复制算法适合用于对象朝生夕死,每次回收仅有少量对象存活的场景,当对象存活率过高时不适合。

因此现代商业虚拟机没有采用 单一 算法,而是综合使用多种算法,实现方式就是:

根据不同的对象存活周期,将内存划分为新生代、老年代两块,在每块区域采用适合自己的回收算法。

  • 新生代的对象 存活率低,大部分对象朝生夕死,又可以用老年代做 分配担保,因此适合用复制算法;
  • 老年代的对象存活率高,没有其他内存做分配担保,因此只能使用标记-清除 & 标记-整理;

更为重要的是,以前进行一次垃圾回收,不可避免伴随 Stop the World,如果回收 整个堆 耗时太长,则通过分代回收,每次仅回收 堆的一部分,可以降低每次垃圾回收的 停顿时间