垃圾回收器
有 8 种垃圾回收器,分别用于不同分代的垃圾回收:
- 新生代回收器:Serial、ParNew、Parallel Scavenge
- 老年代回收器:Serial Old、Parallel Old、CMS
- 整堆回收器:G1、ZGC
Serial:串行回收
-
Serial是最基本、最古老的垃圾收集器
-
Serial收集器采用复制算法、单线程执行和 “STW” 机制的方式进行内存回收
-
除了年轻代之外,Serial 收集器还提供了用于执行老年代垃圾收集的 Serial Old 收集器。
Serial Old 同样采用串行回收和 “STW” 机制,只不过内存回收算法使用的是标记-压缩算法。
-
优势
- 简单高效(与其他收集器的单线程相比),在垃圾收集时暂停了用户线程,专心回收内存,因此单线程效率很高
-
缺点
- 垃圾回收时,有STW时间,不适用于交互性强的应用程序
-
应用场景
- 可以在Client模式下的虚拟机运行
- 在用户的桌面应用场景中,可用内存一般不大(几十MB至上百MB),可以在较短时间内完成垃圾收集
ParNew:并行回收
- Par指Parallel,New指处理新生代的垃圾收集
- ParNew在新生代采用
并行回收、复制算法、STW机制
回收内存 - ParNew是很多 JVM 运行在 Server 模式下新生代的默认垃圾收集器
ParNew + SerialOld 配合使用,ParNew 回收新生代,并行更高效,老年代回收次数少,使用串行更节省资源
Parallel Scavenge:吞吐量优先
- Parallel Scavenge 收集器采用
复制算法、并行回收和STW机制
进行内存回收 - Paralle 收集器和 ParNew 收集器是否重复呢?
- 不是。Parallel Scavenge 收集器的目标是达到一个
可控制的吞吐量
,他也被称为吞吐量优先的垃圾收集器 自适应调节策略
也是 Parallel 与 ParNew 一个重要区别- 自适应调节策略即 Parallel 收集器自动调整 年轻代的大小、Eden 和 Survivor 的比例、晋升老年代的对象年龄等参数,为了更好的平衡堆大小、吞吐量和停顿时间
- 不是。Parallel Scavenge 收集器的目标是达到一个
- 高吞吐量可以高效地利用 CPU 时间,尽快完成程序的运算任务,主要适合
在后台运算不需要太多交互的任务
Parallel Old:吞吐量优先
- Parallel Scavenge 收集器在 JDK1.6 时提供了用于回收老年代的 Parallel Old 收集器,用来代替老年代的 Serial Old 收集器
- Parallel Old 收集器采用了
标记-压缩算法、并行回收和STW
机制回收老年代内存