上图展示了7种,适用于不同分代中的收集器。如果两者之间由连线,说明可以搭配使用。
PS:在JDK8中将Serial+CMS和ParNew+Serial Old的组合声明为废弃,并且在JDK9中完全取消了这两种组合的支持。
1、Serial收集器
Serial收集器是JVM中最早、最基础的一个收集器。这个收集器是一个单线程工作的收集器。采用标记复制算法。它的“单线程”并不仅仅说明它是使用一个处理器或单个收集线程去完全收集工作,更重要的是强调,在它进行垃圾收集工作时,需要将其他所有工作线程(包括用户的工作线程)全部停掉,直到它收集结束(Stop The World)。
下图所示,是Serial/Serial Old收集器的运行过程:
由于Serial收集器的简单高效(与其他收集器的单线程相比)、额外内存消耗最小的特点,Serial收集器更适合用于在单核处理器或者处理器核心较小的的环境上。
2、ParNew收集器
ParNew实际上是Serial收集器的多线程的并行版本。采用的也是标记复制算法。除了使用多线程进行垃圾收集之外,其他的行为包括Serial收集器可用的参数(例如:-XX:SurvivorRatio、-XX:PretenureSizeThreshold)、收集算法、Stop The World、对象分配规则、回收策略等都与Serial收集器一致。
ParNew+Serial Old收集器的运行过程:
但是由于,在JDK9版本中不在支持ParNew+Serial Old的组合,因此只有CMS才能配合ParNew使用。
在JDK5中,HotSpot发布一个跨时代的垃圾收集器,CMS收集器。这款收集器是HotSpot虚拟机中第一个支持并发的垃圾收集器,它首次实现了