知识回顾-JDK有哪些垃圾收集器及收集器组合

openJDK使用到的垃圾收集器、关注点和概念

垃圾收集器之间组合关系

具体组合如下:

Young Tenured JVM options Description
Serial Serial Old -XX:+UseSerialGC 单线程进行GC,适合单CPU或小内存,单机程序
Serial CMS+SerialOld -XX:-UseParNewGC -XX:+UseConcMarkSweepGC CMS进行GC失败时,会自动使用Serial Old 策略进行GC;JDK8中声明为废弃
Parallel Scavenge Serial Old -XX:+UseParallelGC Jdk1.5及之前版本的搭配使用
Parallel Scavenge Parallel Old -XX:+UseParallelGC -XX:+UseParallelOldGC 适合多CPU,需要最大吞吐量,如后台计算型应用;是JDK8默认收集器策略
Parallel New Serial Old -XX:+UseParNewGC JDK8中声明为废弃
Parallel New CMS+SerialOld -XX:+UseParNewGC -XX:+UseConcMarkSweepGC 适合多CPU,追求低停顿时间,需快速响应如互联网应用
G1 -XX:+UseG1GC JDK9默认收集器
ZGC -XX:+UseZGC

垃圾收集算法有:复制算法、标记-清除算法、标记-整理算法。

经典垃圾收集器

  • 七种经典垃圾收集器

串行回收器:Serial、Serial Old
并行回收器:ParNew、Parallel Scavenge、Parallel old
并发回收器:CMS、G1

  • 垃圾回收器特点总结[1]
垃圾收集器 分类 作用位置 使用算法 特点 适用场景 别名
Serial 串行 新生代 复制算法 响应速度优先 适用于单CPU环境下的client模式 Copy
ParNew 并行 新生代 复制算法 响应速度优先 多CPU环境Server模式下与CMS配合使用 ParNew
Parallel 并行 新生代 复制算法 吞吐量优先 适用于后台运算而不需要太多交互的场景 PS Scavenge
Serial Old 串行 老年代 标记-整理(压缩)算法 响应速度优先 适用于单CPU环境下的Client模式 MarkSweepCompact
Paraller Old 并行 老年代 标记-整理(压缩)算法 吞吐量优先 适用于后台运算而不需要太多交互的场景 PS MarkSweep
CMS 并发 老年代 标记-清除算法 响应速度优先 适用于互联网或B/S业务 ConcurrentMarkSweep
G1 并发、并行 新生代、老年代 标记-整理(压缩)算法 响应速度优先 响应速度优先 G1 Mixed Generation

新生代

Serial收集器

  1. 单线程收集器,使用复制算法
  2. 它在进行垃圾收集工作的时候必须暂停其他所有的工作线程( "Stop The World" ),直到它收集结束。

ParNew收集器

  1. 是Serial收集器的多线程版本,使用复制算法
  2. 它能与 CMS 收集器配合工作。

Parallel Scavenge收集器

  1. 多线程版本,使用复制算法
  2. 关注点为吞吐量(高效率的利用CPU),吞吐量就是CPU中用于运行用户代码的时间与CPU总消耗时间的比值。

老年代

Serial Old收集器

  1. 单线程收集器,使用标记-整理算法
  2. Serial Old收集器是Serial收集器的老年代版本,是CMS收集器的后备方案

Parallel Old收集器

  1. 多线程收集器,使用标记-整理算法
  2. Parallel Old收集器是Parallel Scavenge收集器的老年代版本

CMS收集器

  1. 多线程收集器,使用标记-清除算法,会导致收集结束时会有大量空间碎片产生
  2. CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器;关注点:延迟(减少用户线程的停顿时间,提高用户体验)。
  3. 它是HotSpot虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作。

G1收集器

关注点:试图平衡吞吐量和延迟

  1. 主要调优参数为用户所期望的GC停顿STW时间(-XX:MaxGCPauseMillis指定)来制定回收计划
  2. 回收算法--复制算法,将一个region中的存活对象复制到另一个region中,几乎不会有太多内存碎片。

ZGC收集器

如何获取使用的默认的垃圾收集器

  1. 获取 JVM 垃圾收集器的情况,包括使用的哪种垃圾收集器以及回收次数等等。
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;

public class X {
    public static void main(String[] args) {
        for(GarbageCollectorMXBean b : ManagementFactory.getGarbageCollectorMXBeans()) {
            System.out.println(b.getName());
        }
    }
}

  1. -XX:+PrintCommandLineFlags:查看命令行相关参数(包含使用的垃圾收集器)

  2. 使用命令行指令:jinfo -flag 相关垃圾回收器参数 进程ID

[1] 来源于 https://blog.csdn.net/weixin_46115362/article/details/122383160
[2] 来源于 https://www.cnblogs.com/grey-wolf/p/10222758.html

posted @ 2022-12-13 22:26  Luke!  阅读(254)  评论(0编辑  收藏  举报