当前位置 : 主页 > 编程语言 > java >

【Java -- 虚拟机】常见的垃圾收集器

来源:互联网 收集:自由互联 发布时间:2022-06-22
一、前言 垃圾收集器 是 垃圾收集算法 的具体实现。 现在主流的垃圾收集器有 7 种: 二、Serial 收集器 1. 定义 最基本、发展历史最长的垃圾收集器 2. 优点 并发收集 在进行垃圾收集时

一、前言

垃圾收集器 是 垃圾收集算法 的具体实现。
现在主流的垃圾收集器有 7 种:
【Java -- 虚拟机】常见的垃圾收集器_应用场景

二、Serial 收集器

1. 定义
最基本、发展历史最长的垃圾收集器

2. 优点

  • 并发收集
    在进行垃圾收集时,必须暂停其他所有工作线程(Stop The World),直到收集结束。
  • 单线程
    只使用 一条线程 完成垃圾收集(GC线程)
  • 效率高
    对于限定单 CPU 环境来说,Serial 收集器没有线程交互开销(专一做垃圾收集),拥有更高的单线程收集效率。

垃圾收集高效,即其他工作线程停顿时间短(可控制在100ms内),只要垃圾收集发生的频率不高,完全可以接受。

3. 使用的垃圾收集算法
复制 算法

4. 应用场景
客户端模式下,虚拟机的 新生代区域

5. 工作流程
【Java -- 虚拟机】常见的垃圾收集器_垃圾收集算法_02

三、Serial Old 收集器

1. 定义
Serial 收集器 应用在老年代区域 的版本

2. 优点
并发、单线程、效率高

3. 使用的垃圾收集算法
标记-整理 算法

4. 应用场景

  • 在客户端模式下,虚拟机的老年代区域
  • 在服务器模式下:
  • 与 Parallel Scavenge 收集器搭配使用
  • 作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用

5. 工作流程
【Java -- 虚拟机】常见的垃圾收集器_垃圾收集_03

四、ParNew 收集器

1. 定义
Serial 收集器 的 多线程 版本。

2. 优点

  • 并发收集
    在进行垃圾收集时,必须暂停其他所有工作线程(Stop The World),直到收集结束。
  • 多线程收集
    使用 多条垃圾收集线程(GC线程) 完成垃圾收集
  • 与CMS收集器配合工作
    目前,只有ParNew 收集器能与 CMS收集器 配合工作

3. 使用的垃圾收集算法
复制 算法

4. 应用场景
服务器模式下,虚拟机的 新生代区域

5. 工作流程
【Java -- 虚拟机】常见的垃圾收集器_应用场景_04

五、Parallel Scavenge 收集器

1. 定义
ParNew 收集器的升级版

2. 优点

  • 具备 ParNew 收集器并发、多线程收集的特点
  • 以达到 可控制吞吐量 为目标
    其他收集器的目标是: 尽可能缩短 垃圾收集时间,而Parallel Scavenge收集器的目标则是:达到 可控制吞吐量

  • 吞吐量:CPU用于运行用户代码的时间 与 CPU总消耗时间(运行用户代码时间+垃圾收集时间)的比值
    如:虚拟机总共运行100分钟,其中垃圾收集时间=1分钟、运行用户代码时间 = 99分钟,那吞吐量 = 99 / 100 = 99%

    • 自适应
      该垃圾收集器能根据当前系统运行情况,动态调整自身参数,从而达到最大吞吐量的目标。

    3. 使用的垃圾收集算法
    复制 算法

    4. 应用场景
    服务器模式下,虚拟机的 新生代区域

    5. 工作流程
    【Java -- 虚拟机】常见的垃圾收集器_垃圾收集算法_05

    六、Parallel Old 收集器

    1. 定义
    Parallel Scavenge收集器 应用在老年代区域 的版本

    2. 优点
    以达到 可控制吞吐量 为目标、自适应调节、多线程收集

    3. 使用的垃圾收集算法
    标记-整理 算法

    4. 应用场景
    服务器模式下,虚拟机的 老年代区域

    5. 工作流程
    【Java -- 虚拟机】常见的垃圾收集器_应用场景_06

    七、CMS 收集器

    1. 定义
    即 ​​​Concurrent Mark Sweep​​​,基于 ​​标记-清除算法​​的收集器

    2. 优点

    • 并行
      用户线程 & 垃圾收集线程同时进行。
      即在进行垃圾收集时,用户还能工作。
    • 单线程收集
      只使用 一条线程 完成垃圾收集(GC线程)
    • 垃圾收集停顿时间短
      该收集器的目标是: 获取最短回收停顿时间 ,即希望 系统停顿的时间 最短,提高响应速度

    3. 使用的垃圾收集算法
    标记-清除 算法

    4. 应用场景
    重视应用的响应速度、希望系统停顿时间最短的场景

    5. 工作流程
    【Java -- 虚拟机】常见的垃圾收集器_应用场景_07

    八、G1 收集器

    1. 定义
    最新、技术最前沿的垃圾收集器

    2. 优点

    • 并行
      用户线程 & 垃圾收集线程同时进行。

    即在进行垃圾收集时,用户还能工作

    • 多线程
      即使用 多条垃圾收集线程(GC线程) 进行垃圾收集

    并发 & 并行 充分利用多CPU、多核环境下的硬件优势 来缩短 垃圾收集的停顿时间

    • 垃圾回收效率高
      G1 收集器是 针对性 对 Java堆内存区域进行垃圾收集,而非每次都对整个 Java 堆内存区域进行垃圾收集。
    • 分代收集
      同时应用在 内存区域的新生代 & 老年代
    • 不会产生内存空间碎片
    • 从整体上看,G1 收集器是基于 标记-整理算法实现的收集器
    • 从局部上看,是基于 复制算法 实现
      上述两种算法意味着 G1 收集器不会产生内存空间碎片。

    3. 使用的垃圾收集算法
    对于新生代:复制算法
    对于老年代:标记 - 整理算法

    4. 应用场景
    服务器端虚拟机的内存区域(包括 新生代 & 老年代)

    5. 工作流程
    【Java -- 虚拟机】常见的垃圾收集器_垃圾收集_08

    九、总结

    【Java -- 虚拟机】常见的垃圾收集器_垃圾收集_09


    上一篇:【Java -- 基础】多线程基础知识汇总
    下一篇:没有了
    网友评论