JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)

目录

  • 1.垃圾回收器的组合关系
    • 1.年轻代-Serial垃圾回收器
    • 2.老年代-SerialOld垃圾回收器
    • 3.年轻代-ParNew垃圾回收器
    • 4.老年代- CMS(Concurrent Mark Sweep)垃圾回收器
      • CMS执行步骤:
      • CMS垃圾回收器存在的问题缺点:
      • CMS垃圾回收器存在的问题 – 线程资源争抢问题
    • 5.年轻代-Parallel Scavenge垃圾回收器
    • 6.老年代-Parallel Old垃圾回收器

为什么分代GC算法要把堆分成年轻代和老年代?
JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)_第1张图片

⚫ 系统中的大部分对象,都是创建出来之后很快就不再使用可以被回收,比如用户获取订单数据,订单数据返回给用户之后就可以释放了。
⚫ 老年代中会存放长期存活的对象,比如Spring的大部分bean对象,在程序启动之后就不会被回收了。
⚫ 在虚拟机的默认设置中,新生代大小要远小于老年代的大小

分代GC算法将堆分成年轻代和老年代主要原因有:
1、可以通过调整年轻代和老年代的比例来适应不同类型的应用程序,提高内存的利用率和性能。
2、新生代和老年代使用不同的垃圾回收算法,新生代一般选择复制算法,老年代可以选择标记-清除和标记-整理算法,由程序员来选择灵活度较高。
3、分代的设计中允许只回收新生代(minor gc),如果能满足对象分配的要求就不需要对整个堆进行回收(full gc),STW时间就会减少。
JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)_第2张图片

1.垃圾回收器的组合关系

垃圾回收器是垃圾回收算法的具体实现。
由于垃圾回收器分为年轻代和老年代,除了G1之外其他垃圾回收器必须成对组合进行使用。
具体的关系图如下:JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)_第3张图片

1.年轻代-Serial垃圾回收器


Serial是是一种单线程串行回收年轻代的垃圾回收器
JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)_第4张图片
在这里插入图片描述

2.老年代-SerialOld垃圾回收器

SerialOld是Serial垃圾回收器的老年代版本,采用单线程串行回收
-XX:+UseSerialGC 新生代、老年代都使用串行回收器。

JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)_第5张图片
JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)_第6张图片

3.年轻代-ParNew垃圾回收器

ParNew垃圾回收器本质上是对Serial在多CPU下的优化,使用多线程进行垃圾回收.
-XX:+UseParNewGC 新生代使用ParNew回收器, 老年代使用串行回收器

JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)_第7张图片
在这里插入图片描述

4.老年代- CMS(Concurrent Mark Sweep)垃圾回收器

CMS垃圾回收器关注的是系统的暂停时间,
允许用户线程和垃圾回收线程在某些步骤中
同时执行,减少了用户线程的等待时间。

参数:XX:+UseConcMarkSweepGCJVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)_第8张图片
在这里插入图片描述

CMS执行步骤:

1.初始标记,用极短的时间标记出GC Roots能直接关联到的对象。
2.并发标记, 标记所有的对象,用户线程不需要暂停。
3.重新标记,由于并发标记阶段有些对象会发生了变化,存在错标、漏标等情况,需要重新标记。
4.并发清理,清理死亡的对象,用户线程不需要暂停。JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)_第9张图片

CMS垃圾回收器存在的问题缺点:

1、CMS使用了标记-清除算法,在垃圾收集结束之后会出现大量的内存碎片,CMS会在Full GC时进行碎片的整理。这样会导致用户线程暂停,可以使XX:CMSFullGCsBeforeCompaction=N 参数(默认0)调整N次Full GC之后再整理。
2.、无法处理在并发清理过程中产生的“浮动垃圾”,不能做到完全的垃圾回收。
3、如果老年代内存不足无法分配对象,CMS就会退化成Serial Old单线程回收老年代。
JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)_第10张图片

CMS垃圾回收器存在的问题 – 线程资源争抢问题

⚫ 在CMS中并发阶段运行时的线程数可以通过-XX:ConcGCThreads参数设置,默认值为0,由系统计算得出。
⚫ 计算公式为(-XX:ParallelGCThreads定义的线程数 + 3) / 4,ParallelGCThreads是STW停顿之后的并行线程数JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)_第11张图片
⚫ ParallelGCThreads是由处理器核数决定的:
1、当cpu核数小于8时,ParallelGCThreads = CPU核数
2、否则 ParallelGCThreads = 8 + (CPU核数 – 8 )*5/8JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)_第12张图片
JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)_第13张图片
⚫ 由于CPU的核心数有限,就会影响用户线程执行的性能。JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)_第14张图片

CMS垃圾回收器关注的是系统的暂停时间, 允许用户线程和垃圾回收线程在某些步骤中 同时执行,减少了用户线程的等待时间。

参数:-XX:+UseConcMarkSweepGCJVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)_第15张图片
在这里插入图片描述

5.年轻代-Parallel Scavenge垃圾回收器

Parallel Scavenge是JDK8默认的年轻代垃圾回收器,
多线程并行回收,关注的是系统的吞吐量。具备自动
调整堆内存大小的特点。JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)_第16张图片
JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)_第17张图片

Parallel Scavenge允许手动设置最大暂停时间和吞
吐量。
Oracle官方建议在使用这个组合时,不要设置堆内存
的最大值,垃圾回收器会根据最大暂停时间和吞吐量
自动调整内存大小。
JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)_第18张图片

6.老年代-Parallel Old垃圾回收器

Parallel Old是为Parallel Scavenge收集器
设计的老年代版本,利用多线程并发收集

参数: -XX:+UseParallelGC 或
-XX:+UseParallelOldGC可以使用
Parallel Scavenge + Parallel Old这种组合。
JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)_第19张图片
在这里插入图片描述

你可能感兴趣的:(jvm,java,开发语言)