Java虚拟机 JVM的GC总结之垃圾回收器

一.Hotspot虚拟机所包含的收集器类型

在这里插入图片描述

  • 新生代:

    • Serial收集器
    • ParNew收集器
    • Parallel Scavenge收集器
  • 老年代:

    • CMS收集器
    • Serial Old 收集器
    • Parallel Old收集器
  • 整堆收集器:

    • G1收集器

Java 虚拟机的垃圾收集器可以分为四大类别:串行收集器、并行收集器、CMS 收集器、G1收集器。

GC中并行与并发的概念
  • 并行(parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。
  • 并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替进行),用户程序在继续镜像,而垃圾收集程序运行于另一个CPU上。

二.Serial串行收集器

串行收集器是指使用单线程进行垃圾回收的收集器。因为每次回收时只有一个线程,因此串行收集器在并发能力较弱的计算机上,其专注性和独占性的特点往往能让其有更好的性能表现。当虚拟机在 Client 模式下运行时,其默认使用该垃圾收集器。

串行收集器分为Serial和Serial Old两种:

  • 新生代串行收集器中使用的是复制算法。在串行收集器进行垃圾回收时,会触发 Stop-The-World 现象
  • 老年代串行收集器采用标记整理算法。同样是单线程,会触发stop-the-world。
    在这里插入图片描述

三.并行收集器

  • 并行收集器在串行收集器的基础上做了改进,其使用多线程进行垃圾回收。对于并行能力强的机器,可以有效缩短垃圾回收所使用的时间。
  • 并行收集器分为三种:
    • ParNew收集器
    • Parallel GC 收集器
    • ParallelOldGC 收集器
1.ParNew收集器

ParNew收集器其实就是Serial收集器的多线程版本(只在年轻代是多线程)。除了将单线程改为并行执行外,其他没有什么不同

  • ParNew 同样使用复制的垃圾回收算法
  • ParNew 收集器同样存在stop-the-world问题,但因为其使用多线程进行垃圾回收,因此在并发能力强的 CPU 上,其产生的停顿时间要短于串行回收器。
  • ParNew收集器是许多运行在Server模式下的虚拟机中首选的新生代收集器,因为它是除了Serial收集器外,唯一一个能与CMS收集器配合工作的。
    在这里插入图片描述

2.Parallel GC 收集器
  • 与新生代 ParNew 回收器非常类似,其也是使用复制算法,都是多线程、独占式的收集器
  • 其非常注重系统的吞吐量,也称为吞吐量优先收集器
  • 吞吐量的概念:CPU用于运行用户代码的时间与CPU总消耗时间的比值(吞吐量 = 运行用户代码时间 / ( 运行用户代码时间 + 垃圾收集时间 ))。例如:虚拟机共运行100分钟,垃圾收集器花掉1分钟,那么吞吐量就是99%
  • 采用GC自适应调节策略

GC自适应调节策略:Parallel Scavenge收集器可设置-XX:+UseAdptiveSizePolicy参数。当开关打开时不需要手动指定新生代的大小(-Xmn)、Eden与Survivor区的比例(-XX:SurvivorRatio=n)、晋升老年代的对象年龄(-XX:PretenureSizeThreshold)等,虚拟机会根据系统的运行状况收集性能监控信息,动态设置这些参数以提供最优的停顿时间和最高的吞吐量,这种调节方式称为GC的自适应调节策略。

3.Parallel Old 收集器
  • 与新生代 ParallelGC 收集器一样,其也是注重吞吐量的收集器,只不过其是作用于老年代。
  • 采用标记整理算法

在这里插入图片描述


四.CMS收集器

CMS 收集器全称为 Concurrent Mark Sweep,意为标记清除算法,其是一个使用多线程并行回收的垃圾收集器。获取最短回收停顿时间为目标

  • 基于标记-清除算法实现。并发收集、低停顿。
  • 适用于注重服务的响应速度,希望系统停顿时间最短的使用环境
  • 主要工作步骤有:初始标记、并发标记、预清理、重新标记、并发清除和并发充值。其中初始标记和重新标记是独占系统资源的,而其他阶段则可以和用户线程一起执行。
  • CMS收集器的内存回收过程是与用户线程一起并发执行的。

在这里插入图片描述

五.G1收集器

G1 收集器是 JDK 1.7 中使用的全新垃圾收集器

  • 并行并发 :G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU来缩短Stop-The-World停顿时间。部分收集器原本需要停顿Java线程来执行GC动作,G1收集器仍然可以通过并发的方式让Java程序继续运行。
  • 分代收集:G1能够独自管理整个Java堆,使用了分区算法,从而使得 Eden 区、From 区、Survivor 区和老年代等各块内存不必连续
  • 空间整合 :G1运作期间不会产生空间碎片,收集后能提供规整的可用内存。
    Region示意图

G1收集器分为四个工作步骤:

  • 新生代 GC
  • 并发标记周期:在这个阶段,所有将要被回收的区域会被 G1 记录在一个称之为 Collection Set 的集合中。
  • 混合收集:混合回收阶段会首先针对 Collection Set 中的内存进行回收,因为这些垃圾比例较高
  • Full GC:当在回收阶段遇到内存不足时,G1 会停止垃圾回收并进行一次 Full GC,从而腾出更多空间进行垃圾回收

六.ZGC收集器

Java 11包含一个全新的垃圾收集器–ZGC,它由Oracle开发,承诺在数TB的堆上具有非常低的暂停时间。ZGC的设计目标是:支持TB级内存容量,暂停时间低(<10ms),对整个程序吞吐量的影响小于15%。 将来还可以扩展实现机制,以支持不少令人兴奋的功能,例如多层堆(即热对象置于DRAM和冷对象置于NVMe闪存),或压缩堆。

ZGC原理

现在我们了解了不同gc阶段的属性,让我们继续探讨ZGC的工作原理。 为了实现其目标,ZGC给Hotspot Garbage Collectors增加了两种新技术:着色指针和读屏障。

着色指针
着色指针是一种将信息存储在指针(或使用Java术语引用)中的技术。因为在64位平台上(ZGC仅支持64位平台),指针可以处理更多的内存,因此可以使用一些位来存储状态。 ZGC将限制最大支持4Tb堆(42-bits),那么会剩下22位可用,它目前使用了4位: finalizable, remap, mark0和mark1。 我们稍后解释它们的用途。

着色指针的一个问题是,当您需要取消着色时,它需要额外的工作(因为需要屏蔽信息位)。 像SPARC这样的平台有内置硬件支持指针屏蔽所以不是问题,而对于x86平台来说,ZGC团队使用了简洁的多重映射技巧。

多重映射
要了解多重映射的工作原理,我们需要简要解释虚拟内存和物理内存之间的区别。 物理内存是系统可用的实际内存,通常是安装的DRAM芯片的容量。 虚拟内存是抽象的,这意味着应用程序对(通常是隔离的)物理内存有自己的视图。 操作系统负责维护虚拟内存和物理内存范围之间的映射,它通过使用页表和处理器的内存管理单元(MMU)和转换查找缓冲器(TLB)来实现这一点,后者转换应用程序请求的地址。

多重映射涉及将不同范围的虚拟内存映射到同一物理内存。 由于设计中只有一个remap,mark0和mark1在任何时间点都可以为1,因此可以使用三个映射来完成此操作。 ZGC源代码中有一个很好的图表可以说明这一点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值