65.Serial与Serial Old收集器、ParNew收集器、Paralell Scavenge与Parallel Old收集器、CMS收集器

 

1.SerialSerial Old垃圾回收器 - 串行回收

  1. Serial收集器采用复制算法、串行回收和STW机制的方式回收内存。
  2. Serial Old收集器同样采用串行回收和STW机制,只不过回收算法使用的是标记-压缩算法
  3. HotSpot虚拟机的Client模式下,Serial收集器是年轻代的默认垃圾收集器;Serial Old收集器是老年代的默认垃圾回收器。
  4. HotSpot虚拟机的Server模式下,Serial Old有两个用途,与新生代的Parallel Scavenge配合使用;作为老年代CMS收集器的后备垃圾收集方案。
    在这里插入图片描述
  5. SerialSerial Old垃圾回收器是单线程的垃圾回收器,只有一个收集线程区完成垃圾回收工作,并且在垃圾回收的时候会暂停其他的工作线程。如下图。
    在这里插入图片描述
  6. 优缺点
    简单高效。在单CPU环境,Serial收集器没有线程交互的开销,效率高。在用户的桌面应用场景中,可用内存一般不大,使用Serial收集器可以在较短的时间内完成垃圾收集。
    在这里插入图片描述
  7. 使用-XX:+UseSerialGC参数,可以指定年轻代和老年代都使用串行收集器。

2.ParNew垃圾收集器 - 并行回收

  1. ParNew收集器可以说是Serial收集器的多线程版本。ParParallel的缩写;New表示只能处理新生代。
  2. ParNew收集器除了采用并行回收(也就是多个垃圾收集线程)的方式执行内存回收外,和Serial收集器几乎没有任何区别,也是采用复制算法、STW机制。
    在这里插入图片描述
  3. 对于新生代,回收次数频繁,使用并行回收的方式,效率高。
  4. 对于老年代,回收次数少,使用串行回收的方式,节省线程切换锁消耗的资源,效率高。
  5. 下图中,表示的是,新生代使用的是ParNew收集器,老年代使用的是Serial Old收集器。在JDK9中,Serial Old收集器被移除了,所以就不存在这种组合方式了。当然,ParNew还可以和CMS组合,但是在JDK14中,CMS也被删除了。所以,ParNew很尴尬,成了孤家寡人了。
    在这里插入图片描述
  6. ParNew收集器是不是一定比Serial收集器效率高?
    不一定。
    在这里插入图片描述
  7. 设置使用ParNew收集器以及垃圾收集线程数量
    设置垃圾收集线程数的时候,不要超过CPU的核数。
    在这里插入图片描述

3.Paralell Scavenge(吞吐量优先)Parallel Old垃圾收集器 - 吞吐量优先

  1. 除了ParNew收集器是基于并行回收以外,Parallel Scavenge收集器同样采用了复制算法、并行回收和STW机制。
  2. Parallel Scavenge是不是多此一举?Parallel Scavenge收集器的目标是达到一个可控制的吞吐量(吞吐量优先,用户线程占用的时间更长);以及自适应调节策略也是它与ParNew的重要区别。
    在这里插入图片描述
  3. 刚开始Paralle Scavenge收集器适合Serial Old组合的,在JDK6的时候,发布了Parallel Old收集器,用来替代老年代的Serial Old收集器。
  4. Parallel Old收集器使用标记-压缩算法、并行回收和STW机制进行垃圾回收。
    在这里插入图片描述
  5. JDK8中,默认使用的是Paralle Scavenge收集器和Parallel Old收集器的组合。
  6. Parallel收集器参数设置
    在这里插入图片描述
    在这里插入图片描述
    下面这个参数会自动调节年轻代、Eden区和Survivor区的比例(默认是8:1:1,自动调节之后不是)、晋升老年代的对象年龄等参数都会被自动调整。默认开启自适应调节策略。
    在这里插入图片描述

4.CMS垃圾收集器 - 低延迟

  1. CMS - Concurrent-Mark-Sweep收集器是第一款真正意义上的并发收集器,第一次实现了垃圾收集线程和用户线程同时工作。
  2. CMS垃圾收集器采用标记-清除算法,并且也会STW
    在这里插入图片描述
  3. CMS只能和Serial收集器以及ParNew收集器组合使用。
  4. CMS不能等到内存空间不够的时候,再去进行垃圾回收,需要提前进行垃圾回收。因为垃圾回收的时候和用户线程并发执行,如果,内存空间不够了,再去进行垃圾回收,用户线程和垃圾回收线程都没有足够的空间可用了。

CMS工作原理:
分为四个阶段:初始标记 -> 并发标记 -> 重新标记 -> 并发清理 -> 重置线程。
在这里插入图片描述

  1. 初始标记,仅仅只是标记出与GC Roots能直接关联到的对象。初始标记会STW,但是由于直接关联对象比较小,所以这里速度非常快。
  2. 并发标记,从GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程耗时长,不需要停顿用户线程。
    在这里插入图片描述
  3. 重新标记:由于并发标记过程中,工作线程和垃圾收集线程同时运行,因此为了修正并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。
  4. 并发清除:清理标记为垃圾的对象,释放内存空间。
    在这里插入图片描述

CMS的弊端:
在这里插入图片描述
在这里插入图片描述
为什么CMS不使用标记-压缩算法?
在这里插入图片描述
CMS优缺点总结:
在这里插入图片描述
浮动垃圾:在并发标记阶段,新产生的垃圾。

CMS收集器参数设置:

在这里插入图片描述
在这里插入图片描述
如何选择Serial GCParallel GCCMS GC?
在这里插入图片描述

posted @ 2020-11-19 00:00  跃小云  阅读(338)  评论(0编辑  收藏  举报