常见垃圾回收器

总结:Serial是单线程 ,串行的

ParNew是多线程,串行的

Parallel Scavenge(简称Ps),多线程,并行

Parallel Old

CMS:追求最短的停顿时间,并行的,垃圾回收线程可以和用户线程同时执行(只有初始标记阶段需要暂停用户线程,其他阶段不需要暂停用户线程)     采用三色标记法

G1:HotSpot 开发团队赋予它的使命是未来可以替换掉 CMS 收集器

下面是 HotSpot 虚拟机中的 7 个垃圾收集器。上面是新生代的垃圾回收器,下面是老年代的垃圾回收器,G1既可以用于新生代的垃圾回收,也可以用于老年代的垃圾回收,连线表示垃圾收集器可以配合使用

常见垃圾回收器_第1张图片

首先要理解以下两个概念:

(1)单线程和多线程:  垃圾收集器只使用一个线程就说垃圾收集器是单线程的,垃圾收集器使用多个线程就说垃圾收集器是多线程

(2)串行和并行:

串行指的是垃圾收集器和用户程序交替执行(执行垃圾收集器的时候需要停止用户程序,即用户现线程和GC线程交替执行),

并行是指垃圾收集器和用户程序同时执行(也就是执行垃圾收集器的时候不需要停止用户程序,即用户线程和GC线程可以一起执行

1.Serial垃圾回收器

Serial(串行)收集器是最基本、历史最悠久的垃圾收集器了,是一个单线程收集器(也就是它只会使用一个垃圾收集线程去完成垃圾收集工作)              

它在进行垃圾收集工作的时候必须暂停其他所有的工作线程( "Stop The World" ),直到它收集结束

常见垃圾回收器_第2张图片

 Serial垃圾回收器在回收垃圾的时候,新生代采用标记-复制算法,老年代采用标记-整理算法。

Serial 收集器由于没有线程交互的开销,自然可以获得很高的单线程收集效率

2.ParNew收集器

 Serial 收集器的多线程版本,也是新生代采用标记-复制算法,老年代采用标记-整理算法

常见垃圾回收器_第3张图片

 除了 Serial 收集器,只有它能与 CMS 收集器配合使用

 3.CMS垃圾回收器

追求最短的停顿时间,并行的,垃圾回收线程可以和用户线程同时执行(只有初始标记阶段需要暂停用户线程,其他阶段不需要暂停用户线程)

常见垃圾回收器_第4张图片

 CMS(Concurrent Mark Sweep),其中Mark Sweep指的是标记-清除算法,并发的标记-清除算法,也就是说垃圾回收和用户程序是可以同时并发的,尽量减少stop the world(gc线程工作的时候其他用户线程无法工作)的时间,真正做到gc线程和用户线程可以同时工作

整个过程分为以下几个步骤:

 初始标记:暂停所有的其他线程,并记录下直接与 root 相连的对象 (不直接相连,间接相连的不标记),这是一个STW(stop the world)阶段,其他用户线程是不能工作的

并发标记:这个阶段,CMS线程和其他用户线程在并发执行,CMS线程会从与GC Roots直接相连的对象出发,遍历整个对象图 ,进行标记对象

重新标记: 由于上一个阶段并发标记阶段其他用户线程实际上还是在运行的,有可能用户线程在这个阶段产生了新的对象(这些新的对象是没有打上标记的),这里采用三色标记法来标记那些新产生的对象      

并发清理:开启用户线程,并且CMS线程堆未标记的区域进行清扫,这个阶段如果有新增对象会被标记为黑色,不做任何处理       

最后并发重置就是把 标记过的对象取消标记

显然所有的阶段里面只有初始标记和重新标记的时候需要stop the world叫停其他用户线程,其他阶段都是CMS线程和用户线程可以并行的,尤其是耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,不需要进行停顿

 三色标记算法:

黑色:这个对象及其所有的引用的对象都被遍历过,那这个对象就是黑色,黑色的对象不会被回收

灰色:这个对象被遍历过,但是它的部分引用还没被遍历过,在重新标记阶段会将这个对象标记为灰色

白色:这个对象没有被遍历过,在重新标记阶段如果是白色的话,这个对象将被回收

4.G1垃圾收集算法:

G1(Garbage-First),HotSpot 开发团队赋予它的使命是未来可以替换掉 CMS 收集器

堆被分为新生代和老年代,其它收集器进行收集的范围都是整个新生代或者老年代,而 G1 可以直接对新生代和老年代一起回收。

一个堆本来是这样:

常见垃圾回收器_第5张图片

 G1 把堆划分成多个大小相等的独立区域(Region),新生代和老年代不再物理隔离,通过引入 Region 的概念,从而将原来的一整块内存空间划分成多个的小空间,使得每个小空间可以单独进行垃圾回收。这种划分方法带来了很大的灵活性

记录每个 Region 垃圾回收时间以及回收所获得的空间(这两个值是通过过去回收的经验获得),然后维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的 Region。

常见垃圾回收器_第6张图片

 常见垃圾回收器_第7张图片

G1 收集器的运作大致可划分为以下几个步骤:

(1)初始标记

(2)并发标记

(3)最终标记:为了修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录,虚拟机将这段时间对象变化记录在线程的 Remembered Set Logs 里面,最终标记阶段需要把 Remembered Set Logs 的数据合并到 Remembered Set 中。这阶段需要停顿线程,但是可并行执行。

(4)筛选回收:首先对各个 Region 中的回收价值和成本进行排序,根据用户所期望的 GC 停顿时间来制定回收计划。此阶段其实也可以做到与用户程序一起并发执行,但是因为只回收一部分 Region,时间是用户可控制的,而且停顿用户线程将大幅度提高收集效率

你可能感兴趣的:(jvm,jvm)