下面介绍的垃圾收集器没有哪一种是任何场景都完美适用的,只有大家根据自己系统的情况做出正确的选择才是最好的。
先介绍两个概念:
并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。
并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上。
1 Serial收集齐
新生代单线程收集齐,采用的“复制算法”实现,并且用单线程或单个CPU完成收集工作,并且它进行垃圾收集时,必须暂停其它所有的工作线程,即“Stop The World”。
优点:简单而高效,对收集几十兆甚至一两百兆的新生代所消耗的时间完全可以控制在几十毫秒以内,只需要不频繁发生,完全可以使用。
缺点:如果频繁收集或收集量过大则产生较长的时间停顿。
2 ParNew收集器
新生代的多线程收集器,与Serial收集器的区别在于就在于是多线程的。还有最重要一点是因为它可以和CMS联合使用,如果在单CPU中,ParNew收集器并不比Serial效率高,只有CPU比较多的情况下它的优势才能发挥出来。
3 Parallel Scavenge收集器
新生代多线程收集器,它的目标是控制吞吐量,而不是控制垃圾收集器占用的时间。
吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)
-XX:MaxGCPauseMillis参数:控制最大垃圾收集停顿时间
-XX:GCTimeRatio参数:设置吞吐量大小
-XX:+UseAdaptiveSizePolicy参数:这是一个开关,自适应调节策略的开关,打开后配合上面两个参数后不需要手动控制新生代的大小(-Xmn)、Eden与Survivor区的比例(-XX:SurvivorRatio)、晋升老年代对象年龄(-XX:PretenureSizeThreshold)等细节参数了。
4 Serial Old收集器
年老代单线程收集器,采用“标记--整理”算法
5 Parallel Old收集器
Parallel Old是 Parallel Scavenge收集器的老年代版本,使用“标记--整理”算法,该收集器是为了配合Parallel Scavenge而产生的。
6 CMS收集器
并发收集、低停顿老年代收集器,使用“标记--清除”算法。
执行过程分为四步:
a.初始标记:“Stop The World”,仅标记下GC Roots能直接关联的对象,时间很短。
b.并发标记:进行GC Roots Tracing ,可以和用户线程并发进行。
c.重新标记:“Stop The World”,修正并发标记期间因用户继续运作而导致标记产生变动的那一部分对象的标记记录,时间比第一步稍长。
d.并发清楚:可以与用户线程并发执行。
优点:并发收集、低停顿。
缺点:1 对CPU资源非常敏感,由于并发执行导致占用用户线程运行的CPU。
2 CMS无法处理浮动垃圾,可能出现”Concurrent Model Failure“失败导致另一次Full GC,原因是执行清除垃圾时用户线程还会产生垃圾。
3 产生空间碎片,原因是”标记--清楚“算法。
---------------------G1垃圾收集器将在下次分享---------------------------------------------------------------------