Serial收集器
Serial收集器是最基本、发展历史最悠久的收集器。这个收集器是一个单线程的收集器,它在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。它有着优于其他收集器的特点:简单而高效(与其他收集器单线程比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率,Serial收集器多运行在Client模式下的虚拟机。
ParNew收集器
ParNew收集器其实是Serial收集器的多线程版本,多运行在Server模式下的虚拟机新生代的收集器,目前也是只有它可以与CMS收集器配合工作。
Parallel Scavenge收集器
是一个新生代收集器,使用复制算法,又是并行的多线程收集器,Parallel Scavenge收集器的目标是达到一个可控制的吞吐量(Throughput)。所谓吞吐量是指CPU用于运行用户代码的时间与CPU总耗时的比值,即吞吐量= 运行用户代码时间 / (运行用户代码时间+运行垃圾收集时间)。
Serial Old收集器
Serial Old是Serial 收集器的老年代版本,同样是一个单线程收集器,使用“标记-整理”算法。主要给Client模式下的虚拟机使用,如果再Server模式下,主要有2个用途:一是与Parallel Scavenge收集器搭配使用,而是作为CMS收集器的后备预案。
Parallel Old收集器
Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。
CMS收集器
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收时间停顿为目标的收集器。基于“标记-清楚”算法实现,并发收集、低停顿,整个运行过程分为4步:
- 初始标记
- 并发标记
- 重新标记
- 并发清除
缺点: - CMS收集器对CPU资源非常敏感
- CMS收集器无法处理浮动垃圾(Floating Garbage),可能出现“Concurrent Mode Failure”失败而产生另一次Full GC的产生
- 基于标记-清除算法会产生大量空间碎片
G1收集器
G1(Garbage-First)是一款面向服务端应用的垃圾收集器,具有以下特点:
- 并行与并发,充分利用多CPU、多核环境下的硬件优势,使用多个CPU(或者CPU核心)来缩短Stop The World停顿时间
- 分代收集
- 空间整合,从整体来看采用“标记-整理”算法,从局部看基于”复制“算法实现,不会产生空间碎片
- 可预测的停顿
使用G1收集器时,Java堆的内存布局与其他收集器有很大的差别,它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留新生代和老年代的概念,但新生代和老年代不再是物理隔离,他们都是一部分Region(不需要连续)的集合。G1收集器之所以能够建立可预测的停顿模型,是因为它可以有计划的避免在整个Java堆中进行全区域的垃圾收集。G1跟踪各个Region里面的垃圾堆的价值大小(回收所获得的空间大小以及回收所需要时间的经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region(这也是Garbage-First名称的由来)。
参考资料
- 深入理解Java虚拟机 JVM高级特性与最佳实践 第2版
网友评论