Serial收集器是历史最悠久的收集器,曾经是新生代收集器的唯一选择,它是一个单线程工作的收集器,其“单线程”的意义不仅仅是说明它只会使用一个处理器或者一条收集线程去完成垃圾收集工作,更重要的是强调它在进行垃圾回收的时候,必须暂停其他所有工作线程,直到它收集结束
优点:
ParNew收集器手机上是Serial收集器的多线程并行版本
注意:除了Serial收集器之外,目前只有它才可以和CMS进行配合工作
但是随着垃圾回收器的不断改进,更先进的G1收集器带着CMS的继承者和替代者出现了,G1是一个面向全堆的收集器,不需要其他收集器进行配合工作,从这(JDK9)之后,取消了ParNew+SerialOld 以及Serial+CMS的收集器组合,变相的将ParNew合并到了CMS中,称为它专门处理新生代的组成部分,ParNew可以说是第一个退出历史舞台的垃圾收集器
Parallel Scavenge收集器(吞吐量优先收集器)也是一款新生代收集器,它同样是基于标记-复制算法实现的收集器,也是能够并行收集的多线程收集器,其收集器的特点是它的关注点与其他收集器不同,CMS等收集器关注的是尽可能的缩短垃圾收集时用户的停顿时间,而Parallel Scavenge收集器关注的是达到一个可控制的吞吐量(处理器用于运行用户代码的时间与处理器总消耗时间的比值)
注意:
Serial Ol是Serial收集器的老年代版本,它同样是一个单线程收集器,使用标记-整理算法
Parallel Old是Parallel Scavenge收集器的老年代版本,支持多线程并发收集,基于标记-整理算法实现,它的出现,“吞吐量优先”收集器终于有了比较名副其实的搭配组合,在注重吞吐量或者处理器资源较为稀缺的场合,都可以优先考虑Parallel Scavenge + Parallel Old收集器这个组合
CMS收集器是一种以获得最短回收停顿时间为目标的收集器,其基于标记-清除的算法实现,分为4个步骤:
Garbage First(G1)收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式
使用记忆集避免全堆作为GC Roots的扫描对象,其每个Region都维护有自己的记忆集,这些记忆集会记录下别的Region指向自己的指针,并标记这些指针分别在哪些卡页的范围内,G1的记忆集更像一个哈希表,key值是Region的起始位置,value是集合(卡表的索引),但是由于Region的数量比较多,所以G1收集器要比其他的收集器有着更高的内存占用负担(耗费相当于Java堆的10%~20%的额外内存)
G1收集器时采用原始快照算法实现,垃圾收集的过程中肯定会有新的对象被创建,G1为每一个Region设计了两个名为TAMS的指针,把Region中的一部分空间划分出来用于并发回收过程中的对象内存分配,并发回收时新分配的对象地址都必须要在这两个指针位置上,G1收集器默认在这个地址以上的对象是被隐式标记过的(默认是存活的),不纳入回收范围之内,但是如果内存回收的速度赶不上创建对象分配内存的速度,会冻结用户线程,而导致长时间的“Stop the world”
G1收集器的停顿预测模型是以衰减均值为理论基础实现的,在垃圾收集的过程中,G1收集器会记录每个Region的回收耗时以及记忆集里的脏卡数量等各个可测量的步骤花费的成本,并分析得出平均值、标准偏差、置信度等统计信息,Region的统计状态越新越能决定其回收的价值,然后通过这些信息预测回收哪些Region才可以在不超过期望停顿时间的约束下获得最高的利益
在未来CMS肯定会被G1取代,但是在这个两者并存的时代中,难免会有比较