1、Serial 收集器
Serial 收集器是新生代的单线程收集器,它“单线程”的意义体现在:
1.它只会使用一个CPU或一条收集线程去完成垃圾收集工作;
2.它在进行垃圾收集时,必须暂停其他所有的工作线程(既Stop The World),直到它收集结束。
Stop The World是由虚拟机在后台自动发起和自动完成的,在用户不可见的情况下把正常的工作线程全部停掉,这对很多应用来说都是难以接收的,应该尽量避免Stop The World。
2、Serial Old 收集器
Serial Old 收集器是老年代的单线程收集器,使用“标记-整理”算法,除了与新生代的Serial收集器配合之外,Serial Old 收集器的另一种用途就是作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用。
3、Serial + Serial Old
Serial 和 Serial Old虽然是单线程收集器,但它有着优于其他收集器的地方,简单而高效(与其他收集器的单线程相比),对于限定单个CPU的环境来说,它们由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。
4、ParNew 收集器
ParNew收集器是新生代收集器,它是Serial收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其余行为包括Serial收集器可用的所有控制参数(例如:-XX:SurvivorRatio
、-XX:PretenureSizeThreshold
、-XX:HandlePromotionFailure
等)、收集算法、Stop The World、对象分配规则、回收策略等都与Serial收集器完全一样,在实现上,这两种收集器也共用了相当多的代码。
ParNew 收集器除了多线程收集之外,其他与Serial收集器相比没有太多创新之处,但它却是许多运行在Server模式下的虚拟机钟首选的新生代收集器,其中一个与性能无关但很重要的原因是,除了Serial收集器外,目前只有它能与CMS收集器配合工作。
ParNew 收集器在单CPU的环境中绝对不会有比Serial收集器更好的效果,甚至由于存在线程交互的开销,该收集器在通过超线程技术实现的两个CPU的环境中都不能百分百地保证可以超越Serial收集器。当然,随着可以使用的CPU的数量的增加,它对与GC时系统资源的有效利用还是很有好处的。它默认开启的收集线程数与CPU的数量相同,在CPU非常多(譬如32个)的情况下,可以使用-XX:ParallelGCThreads
参数来限制垃圾收集的线程数。
5、并行(Parallel)和并发(Concurrent)
并行(Parallel)收集器:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态;
并发(Concurrent)收集器:指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上。