GC-垃圾收集器

HotSpot JVM支持多种垃圾收集器,垃圾收集器是按对象的分代来划分的,可以用线条连接的垃圾回收器表示两者可以配合使用。可以看到新生代垃圾收集器有Serial、ParNew、Parallel Scavenge,G1,属于老年代的垃圾收集器有CMS、Serial Old、Parallel Old和G1.其中的G1是一种既可以对新生代对象也可以对老年代对象进行回收的垃圾收集器。然而,在所有的垃圾收集器中,并没有一种普遍使用的垃圾收集器。在不同的场景下,每种垃圾收集器有各自的优势。

CMS收集器

CMS收集器(Concurrent Mark Sweep)的目标就是获取最短回收停顿时间。在注重服务器的响应速度,希望停顿时间最短,则CMS收集器是比较好的选择。

整个执行过程分为以下4个步骤:

1.初始标记

2.并发标记

3.重新标记

4.并发清除

初始标记和重新标记这两个步骤仍然需要暂停Java执行线程,初始标记只是标记GC Roots能够关联到的对象,并发标记就是执行GC Roots Tracing的过程,而重新标记就是为了修正并发标记期间因用户程序执行而导致标记发生变动使得标记错误的记录。其执行过程如下:


GC-垃圾收集器_第1张图片


CMS的优点很明显:并发收集、低停顿

缺点:碎片化,可能放不下大对象,通过控制参数

-XX:+UseCMSCompactAtFullCollection,用于在CMS垃圾收集器顶不住要进行FullGC的时候开启空间碎片的合并整理过程。


G1收集器:

直到jdk7u4之后,才正式作为商用的收集器。

与前几个收集器相比,G1收集器有以下特点:

1.并行与并发

2.分代收集(仍然保留了分代的概念)

3.空间整合(整体上属于“标记-整理”算法,不会导致空间碎片)

4.可预测的停顿(比CMS更先进的地方在于能让使用者明确指定一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒

G1的工作过程如下:

a.初始标记(Initial Marking)

b.并发标记(Concurrent Marking)

c.最终标记(Final Marking)

d.筛选回收(Live Data Counting and Evacuation)

你可能感兴趣的:(GC-垃圾收集器)