Serial收集器:是一个单线程的收集器,使用一个CPU或一条收集线程。在进行垃圾收集时,必须暂停其他所有的工作线程,直到收集结束。在用户不可见的情况下,把正常工作的线程全部停止,对很多应用来说难以接受,所以虚拟机开发团队一直寻求消除或减少停顿时间的方法。它是虚拟机运行在Client模式下的默认新生代收集器,优于其他收集器的地方,简单而高效(与其他收集器的单线程比),对于限定单个CPU的环境来说,没有线程交互的开销,专心做垃圾回收自然可以获得最高的单线程收集效率,对于运行在Client模式下的虚拟机是一个很好的选择。
ParNew收集器:Serial收集器的多线程版本,是许多运行在Server模式下的虚拟机首选的新生代收集器,除了Serial收集器,目前只有它能与CMS收集器配合工作。
Parallel Scavenge收集器:目标是达到一个可控制的吞吐量(吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)),停顿时间越短越适合需要与用户交互的程序,良好的响应速度能提升用户体验,而高吞吐量则可以高效率地利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。
Serial Old收集器:是一个单线程收集器,Serial收集器的老年代版本,使用“标记-整理”算法,给Client模式下的虚拟机使用。
Parallel Old收集器:Parallel Scavenge收集器的老年代版本,使用多线程“标记-整理”算法,Parallel Scavenge/Parallel Old组合成吞吐量优先的应用组合。
CMS收集器:目标是获得最短回收停顿,基于“标记-清除”算法,运作过程分为四步,初始标记、并发标记、重新标记、并发清除。初始标记和重新标记需要停止用户线程。初始标记仅仅标记一下GC Roots能直接关联到的对象,速度很快,并发标记进行GC Roots Tracing的过程,重新标记是为了修正并发标记期间因用户程序继续执行而导致标记产生变动的那一部分对象的标记记录。
G1收集器,收集器技术发展的最前沿技术之一,是一款面向服务端应用的垃圾收集器,在G1之前其他收集器的收集范围是整个新生代或老年代,而G1的Java堆内存布局与其他收集有很大差别,它将整个Java堆划分成多个大小相等的独立区域,虽然保留新生代和老年代的概念,但新生代和老年代不再是物理隔离的了。
能建立可预测的停顿时间模型,因为G1跟踪各个Region里面垃圾堆积的价值大小(可回收所获得的空间大小以及回收所需时间的经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region。
G1的每个Region都有一个与之对应的Remembered Set,在GC根节点的枚举范围中加入Remembered Set即可保证不对全堆扫描也不会有遗漏。
运作过程:初始标记、并发标记、最终标记、筛选回收,前三步与CMS的目的是一样的,筛选回收阶段首先对各个Region的回收价值和成本进行排序,根据用户期望的GC停顿时间制定回收计划。