java虚拟机之垃圾收集器
年轻代收集器
Serial收集器
Serial收集器使用标记-复制垃圾收集算法。Serial收集器只能使用一条线程进行垃圾收集工作,并且在进行垃圾收集的时候,所有的工作线程都需要停止工作,等待垃圾收集线程完成以后,其他线程才可以继续工作。在单核情况下,因为减少了很多线程的上下文切换的开销,这款收集器还是非常简单高效的。
ParNew收集器
ParNew垃圾收集器是Serial收集器的多线程版本,使用标记-复制垃圾收集算法。运行多个收集线程来进行垃圾收集工作。这样可以提高垃圾收集过程的效率。ParNew收集器默认开启的垃圾收集线程数是和当前机器的CPU数量相同的,为了控制GC收集线程的数量,可以通过参数-XX:ParallelGCThreads来控制垃圾收集线程的数量。
Parallel Scavenge收集器
Parallel Scavenge收集器它使用标记-复制垃圾收集算法。和ParNew一样,它也会一款多线程的垃圾收集器。
老年代收集器
Serial Old收集器
Serial Old收集器是使用"标记-整理"算法的单线程的垃圾收集器。
Parallel Old收集器
使用"标记-整理"算法。是Parallel Scavenge收集器的老年代版本。
CMS收集器
是一种以获取最短回收停顿时间为目标的收集器。基于“标记-清除”算法实现的,它的运作过程分为4个步骤,包括:
初始标记(CMS initial mark)
并发标记(CMS concurrent mark)
重新标记(CMS remark)
并发清除(CMS concurrent sweep)
其中初始标记、重新标记这两个步骤仍然需要“Stop The World”。初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,并发标记阶段就是进行GC Roots Tracing的过程,而重新标记阶段则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短。
由于整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,所以总体上来说,CMS收集器的内存回收过程是与用户线程一起并发地执行。优点:并发收集、低停顿。缺点:产生大量空间碎片、并发阶段会降低吞吐量-XX:+UseConcMarkSweepGC 使用CMS收集器-XX:+ UseCMSCompactAtFullCollection Full GC后,进行一次碎片整理;整理过程是独占的,会引起停顿时间变长,-XX:+CMSFullGCsBeforeCompaction 设置进行几次Full GC后,进行一次碎片整理-XX:ParallelCMSThreads 设定CMS的线程数量(一般情况约等于可用CPU数量)