这里讨论HotSpot虚拟机所拥有的收集器。
Serial收集器是最基本、发展历史最悠久的收集器。该收集器是一个单线程收集器(进行GC时必须暂停其它所有的工作线程,知道GC结束)。
相比其它收集器:它简单高效,因为单线程无线程交互的开销,而属于单线程收集效率最高的。
时间在几十毫秒到一百多毫秒之间,很适合Clinet模式下的虚拟机。
ParNew实际上是Serial收集器的多线程版。它拥有Serial收集器可用的所有控制参数、收集算法、Stop the World(停顿)、对象分配规则、回收策略等。
它现在被作为很多Server模式下的虚拟机的新生代收集器。很大一点原因是只有它和Serial能和之后讲的CMS收集器配合。
Parallel Scavenge收集器 是一个新生代收集器,所以它是使用复制算法的并行的多线程收集器。
其它收集器是尽可能缩短GC时的停顿时间,而Parallel Scavenge收集器则更关注与达到一个可控的吞吐量。
吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。
Parallel Scavenge收集器提供了两个参数,用于精确控制吞吐量:
控制最大垃圾收集停顿时间:-XX:MaxGCPauseMillis (>0ms)
直接设置吞吐量大小:-XX:GCTimeRatio (0~100)
Serial Old 是Serial收集器的老年代版本(就是存活率高的),也是一个单线程收集器,主要还是为Clinet模式的虚拟机
用途1:可作为CMS收集器的后备预案
用途2:与Parallel Scavenge收集器搭配使用。
Parallel Old 是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理“算法。该收集器是JDK1.6开始的。
还是注重吞吐量。
CMS收集器是一种以获取最短回收停顿时间为目标的收集器。
CMS收集器是基于“标记-清除”的算法实现的,整个过程分为4个步骤:初始标记->并发标记->重新标记->并发清除。
初始标记和重新标记需要停顿,初始标记标记一下GC Roots能直接关联到的对象(很快),并发标记进行GC Roots Tracing的过程,重新标记是为了修正变动的标记记录
G1收集器是一款面向服务端应用的垃圾收集器
特点:1.并行并发降低停顿时间 2.分代收集提高收集效果 3.空间整合提供规整的可用内存,不产生碎片,利于程序长时间运行
4. 可预测的停顿可以指明垃圾收集的片段时间。
过程步骤也分4个步骤:初始标记、并发标记、最终标记、筛选回收
对于GC日志,书上已经讲的很好了,我这边就不记录了。