Java虚拟机中的垃圾收集器

以hotpot为例
Serial收集器
    Serial收集器是最基本、发展最悠久的收集器。它是一个单线程的收集器,这不仅仅意味着它只使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停所有其他的工作线程,直到它收集结束。目前它依然是虚拟机运行在Client模式下默认的新生代收集器。
    它的优势在于相比其它单线程收集器而言它更简单高效,因为对比限定单个CPU的环境来说,它由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集下效率。而在用户的桌面应用场景中,分配给虚拟机管理的内存一般来说不会很大,收集几十兆甚至一两百兆的新生代,停顿时间完全可以控制在几十毫秒最多一百多毫秒以内,不频繁发生,用户是可以接受。所以Serial收集器对于出于Client模式下的虚拟机来说是一个很好的选择。
ParNew收集器
     ParNew收集器其实就是Serial收集器的多线程版本,其他的与Serial收集器相比没有多大的创新之处,但它却是许多运行在Server模式下的虚拟机首先的新生代收集器,同时它是除了Serial收集器外,目前能与CMS收集器配合工作的收集器。
Parallel Scavenge收集器
    Parallel Scavenge也是一个新生代收集器,也使用复制算法的收集器,也是并行的多线程的收集器。但它的关注点不一样,其它的收集器适用于需要与用户进行交互的程序,所以需要良好的响应速度以提高用户体验,但是Parallel Scavenge收集器的目标是达到一个可控制的吞吐量。而高吞吐量可以高效率的利用CPU时间,尽快完成程序的运算任务,主要适合后台运算而不需要太多交互的任务。
Seral Old收集
    Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用“标记-整理”算法。主要意义也是运用在Client模式下的虚拟机中。如果是在Server模式下,那它主要是:一个用在JDK1.5以及之前的版本中与Parallel Scavege收集器搭配使用,二是作为CMS收集器的后备方案,并在收集发生Concurrent Model Failure时使用。
Parallel Old收集器
    Parallel Old是Parallel Scavege收集器的老年代版本,使用多线程和“标记-整理”算法,在Parallel Old没有出现的JDK1.5之前,Parallel Scavenge收集器处于尴尬地位,一方面不能搭配CMS使用,所以只能和Serial Old搭配使用,但Serial Old收集器在服务端应用性能上的“拖累”,是得即使使用了Parallel Savenge收集器也未必能在整体应用上获得吞吐量最大化。在Parallel Old收集后,“吞吐量”优先的收集器终于有了比较名副其实的应用组合,在注重吞吐量和CPU资源敏感的场合,都可以优先考虑Parallel Scavenge和Parallel Old二者搭配使用。
CMS(Concurrent Mark Sweep)收集器
    CMS收集器是一种以获取最短回收暂停时间为目标的收集器,基于“标记-清除”算法实现。
    分为4个步骤,包括:①初始标记;②并发标记;③重新标记;④并发清除;其中,初始标记和重新标记依然是基于“Stop The World”(暂停所有的工作线程),初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,并发标记阶段就是进行GC Roots Tracing的过程,而重新标记阶段则是为了修正并发标记期间因用户线程继续运作而导致标记变动的那一部分对象的标记记录,这个阶段的停顿时间一般比初始标记稍长但远比并发标记的时间段。
    由于整个过程中最长的并发标记和并发清除过程收集器线程都可以与用户线程一起工作,所以,从总体来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。
    优点:并发收集、低停顿,被称为“并发低停顿”收集器。
    缺点:①CMS收集器对CPU资源非常敏感。在并发阶段,虽然它不会导致用户线程停顿,但是会因为占用了一部分线程(或者说是CPU)导致应用程序变慢,总吞吐量会降低。②CMS收集器无法处理浮动垃圾,可能会出现“Concurrent Model Failure"失败而导致另一次Full GC的产生。这是由于CMS并发清理阶段用户线程还在运行着,伴随程序运行自然会产生心得垃圾,这部分垃圾出现在标记过程后,CMS无法在当次收集中处理掉它们,只好留待下一次GC时处理。③CMS收集器是基于“标记-清除”算法的,所以会在收集完成后产生大量的空间碎片。当空间碎片过多的时候,将会给大对象的分配带来麻烦,往往老年代还有很大的剩余空间,但是无法找到足够大的连续空间来分配当前对象,不得不触发一次Full GC.
G1(Garbage-First)收集器
    G1收集器是当今收集器技术发展的最前沿成果之一,但是由于发布时间短,几乎没有经过实际应用的考验。G1是一款面向服务端应用的垃圾回收器。不需要其他收集器的配合可以管理整个GC堆。
    特点:①分代收集;②空间整合;③可预测的停顿;④空间整合;
    步骤:①初始标记;②并发标记;③最终标记;④筛选回收;
联系
连线表示二者可以配合使用

猜你喜欢

转载自www.cnblogs.com/LynnMin/p/9417415.html