vlambda博客
学习文章列表

Serial 和SerialOld 垃圾回收器

前言

接下来的几篇文章都是介绍垃圾回收器,这里按照经常组合使用的新生代、老年代收集器一起阐述。在JDK1.3.1 之前是Serial 和SerialOld 搭配使用;JDK1.5.0 之后出现了Parallel Scavenge 和 和SerialOld、Serial、Parnew 和CMS、Parallel Scavenge 和Parallel Old组合;JDK1.8 之后根据新的化整为零思想单独使用,分别是G1(Garbage First)、Shenandoah、ZGC 这些组合收集器。随着对算法的优化和演变,先后出现Serial,还是后面的ZGC ,但是他们都遵循垃圾回收器的理论,都是朝着低时延,高吞吐的目标。

Serial 收集器

1. 概述

Serial 是一款使用标记-复制算法的单线程工作的垃圾回收器 ,而且在工作时必须停掉用户线程STW直到垃圾结束。运行示意图如下:

2. 特点

  1. 设计简单;
  2. 在内存受限的环境中,依旧能够高效运行, 因为其是单线程执行,避免了线程切换的开销,更加专注垃圾回收。

3. 使用

-XX:+UseSerialGC 打开后,使用Serial和Serial Old 组合进行垃圾回收。

4. 使用场景

  1. 桌面级应用:桌面级应用新生代一般在几十到,一两百兆;
  2. 限制单核处理器的场景:Serial 单线程串行执行,没有线程切换开销。

SerialOld 收集器

1. 概述

SerialOld 是一款老年代垃圾回收器,采用标记-整理算法,单线程运行,而且在工作是会造成STW,与之搭配的年轻代回收器有SerialParallel Scavenge,以及CMS回收失败时 的兜底回收方案。

2. 特点

  1. 设计简单;
  2. 在内存受限的环境中 与Serial 年轻代回收器绝佳搭配。

3. 使用

  1. -XX:+UseSerialGC 打开后,使用Serial和Serial Old 组合进行垃圾回收。

4. 使用场景

  1. 内存有限,单核处理器场景使用;
  2. 在垃圾创建速度大于回收速度时,可以使用Serial Old 回收器作为备份方案。