新生代收集器
Serial收集器
它是最基本、历史最悠久的收集器,在JDK1.3.1之前是虚拟机新生代收集的唯一选择。它是一个单线程的收集器,到现在为止,它依然是虚拟机运行在Client模式下的默认的新生代收集器。优点:简单高效。
特点:只会使用一个CPU或一条收集线程去完成垃圾收集工作,在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。它没有线程交互的开销,所以可以获得最高的单线程收集效率。
ParNew收集器
Serial收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其余行为和Serial收集器完全一样。是Server模式下的虚拟机中首选的新生代收集器。目前只有它能与CMS收集器配合工作。是-XX:+UseConcMarkSweepGC选项后的默认新生代收集器,也可以使用-XX:+UseParNewGC选项来强制制定它。默认开启的收集线程数与CPU的数量相同。可以使用-XX:ParallelGCThreads参数来限制垃圾收集的线程数。
Parrallel Scavenge收集器
此收集器的关注目标是达到一个可控制的吞吐量。高吞吐量可以最高效率地利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。
吞吐量=运行用户代码的时间/(运行用户代码时间+垃圾收集时间)
-XX:MaxGCPauseMillis控制最大垃圾收集停顿时间
-XX:GCTimeRatio直接设置吞吐量大小
-XX:UseAdaptiveSizePolicy开启自适应调节策略
老年代收集器
Serial Old收集器
Serial收集器的老年代版本,使用“标记-整理”算法
Parrallel Old收集器
Parrallel Scavenge老年代版本,使用多线程和“标记-整理”算法,
CMS(Concurrent Mark Sweep)收集器
基于“标记-清除”算法实现,以获取最短回收停顿时间为目标的收集器,主要用于重视服务的响应速度的应用如B\S系统的服务端。
过程:
初始标记:需要Stop The World,只是标记一下GC Roots能关联到的对象,速度很快。
并发标记:进行GC Root Tacing的过程。
重新标记:需要Stop The World,修正并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,停顿时间比初始标记阶段稍长,但远比并发标记阶段短。
并发清除:进行并发清除。
缺点:
1、对CPU资源敏感,会占用一部分线程资源,默认启动线程数量是(CPU数量+3)/4
2、无法处理浮动垃圾,可能出现“Concurrent Mode Failure”失败从而导致另一次Full GC的产生。
CMS默认在老年代使用了68%的空间后就会被激活,可以适当调高参数-XX:CMSInitiatingOccupancyFraction的值来提高触发百分比,以便降低内存回收次数以获取更好的性能。但不能设置太高,要预留适当的内存供程序使用,否则可能会出现“Concurrent Mode Failure”导致虚拟机启动后备预案临时启用Serial Old收集器来重新进行老年代的垃圾收集,这样停顿的时间就很长了。
3、可能会产生大量的空间碎片,导致提前出发一次Full GC。
参数-XX:UseCMSCpactAtFullCollection,设置CMS在完成垃圾收集之后是否要进行一次内存碎片整理。仅在使用CMS收集器时生效
参数-XX:FullGCsBeforeCompaction,设置CMS收集器在进行若干次垃圾收集之后在启动一次内存碎片整理。仅在使用CMS收集器时生效
G1收集器
基于“标记-整理”算法实现,可以非常精确的控制停顿。(//to do)