1.Serial收集器
进行垃圾收集时,需要暂停其他所有的工作线程(Stop the world),知道它完成收集工作。暂停所有工作线程带来不良的用户体验,但由于其简单而高效,Client模式下的虚拟机仍然是个很好的选择。
2.ParNew收集器
Serial收集器的多线程版本,是许多运行在Server模式下的虚拟机首选的新生代收集器(一个原因是只有它才能与CMS收集器配合工作)。单CPU下效率比起Serial收集器没有提高甚至由于存在线程交换开销,还不如Serial收集器。
3.Parallel Scavenge收集器
其他收集器关注点在于尽可能缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的关注点是达到一个可控的吞吐量(吞吐量=运行用户代码时间/垃圾收集时间)。停顿时间越短越适合与用户交互的程序,提升用户体验,高吞吐量则可以高效利用CPU时间,适合后台运算而不需要太多交互的任务。
-XX:MaxGCPauseMills 参数控制垃圾收集停顿时间,缩短时间的代价是新生代空间变小,垃圾收集随之更加频繁。
-XX:GCTimeRatio 参数是垃圾收集时间占总时间的比率,即吞吐量的倒数。
4.Serial Old收集器
Serial收集器的老年代版本。单线程收集器,使用“标记-整理”算法。
5.Pareallel Old收集器
Parallel Scavenge收集器的老年代版本。多线程收集器,使用“标记-整理”算法。
6.CMS(Concurrent Mark Sweep)收集器
采用“标记-清除”算法实现,整个过程包括4个步骤:初始标记、并发标记、重新标记和并发清除。其中初始标记和重新标记依然需要 Stop the world。
初始标记只是标记GC Roots能关联到的对象,速度很快;并发标记进行GC Roots Tracing;重新标记是为了修正并发标记期间因用户程序继续运行而导致标记变动的对象的标记。
7.G1(Garbage First)收集器
面向服务器端的垃圾收集器。