G1与ZGC

article/2025/9/1 8:31:15

目录

  • 前言
  • JDK7和JDK8的GC
  • G1
    • Region
    • GC模式
      • Young GC
      • Mixed GC
      • Full GC
  • ZGC
    • Region
    • GC模式
  • 一些感悟
  • 一些图
  • 文末彩蛋

前言

Java发展至今,最新版本是JDK16,最新的LTS长期支持版本是JDK11,今年9月即将推出JDK17,将是最新一代LTS。
在这里插入图片描述
但是,包括笔者在内,绝大多数Java程序猿依然奋战在JDK8一线。
GC(Garbage Collection)垃圾回收作为Java的重要部分,JDK7和JDK8使用的是传统的年轻代与老年代物理空间区分的方式,JDK9将G1作为了默认GC器,JDK11推出了ZGC。

JDK7和JDK8的GC

JDK7将堆空间分为年轻代、老年代、永久代,JDK8删除了永久代,取而代之的是堆外的元空间。
在这里插入图片描述
回收算法主要有复制清除(Copying)算法(年轻代)、标记整理(Mark-Compact)算法(老年代)、标记清除(Mark-Sweep)算法。

G1

G1全称为Garbage First,从名字就看得出来,这个GC不简单。
G1最大的改变是打破了年轻代与老年代的物理空间壁垒,但保留了逻辑上的区分。

Region

G1将堆空间分为一个一个方形区域(Region)。可通过参数-XX:G1HeapRegionSize设置单个Region的大小,取值范围1M-32M,2的n次幂。默认为堆内存/2048,即一共2048个Region。
一段连续的空间,根据需要可扮演不同角色,可以是年轻代的伊甸区(E)、幸存区(S),也可以是老年代(O)。
除了E、S、O,还有一种代号为H的Region,是以往算法里没有的概念。H代表Humongous,即大对象。当一个对象的大小超过了Region的一半,则视为大对象,如果超过了整个Region的大小,将使用连续N个H Region来存放。虽说Humongous跳出了年轻代和老年代的概念,但G1的大多数行为都把它视为老年代的一部分。
在这里插入图片描述

GC模式

G1出现之前,GC范围是整个年轻代(Minor GC)、整个老年代(Major GC)、整个堆空间(Full GC)。
G1的GC模式有Young GC、Mixed GC、Full GC。

Young GC

除了大对象在H Region分配空间,一般对象都在E Region分配。当所有E Region被耗尽,触发一次Young GC,执行完后,活跃对象会被copy到S Region或晋升到O Region,空闲的E Region加入空闲列表。
可以看到,G1的Young GC与G1出现之前的Young GC,逻辑基本一致。
在这里插入图片描述

Mixed GC

G1可以回收堆空间的任何部分,组成回收集(Collection Set、CSet)来回收,衡量标准不再是属于哪个分代,而是哪块内存中垃圾数量最多,回收收益最大,这就是Mixed GC。
Mixed GC回收所有E Region、S Region和部分的O Region及H Region。
可通过参数-XX:InitiatingHeapOccupancyPercent设置阈值,当O Region占整个堆空间百分比达到此阈值,触发一次Mixed GC,包括以下几步:

  1. 初始标记(Initial Mark):标记从GC Root可达的对象。此阶段会STW(Stop The World)。
  2. 并发标记(Concurrent Mark):采用三色标记法,标记整个堆空间的可访问的对象。此阶段不会STW,与应用程序同时运行。此阶段时间长,约占整个Mixed GC的80%
  3. 最终标记(Remark):标记并发标记阶段遗漏或引用发生变化的对象。此阶段会STW。
  4. 垃圾清除(Cleanup):空闲的Region加入空闲列表。此阶段会STW。
    在这里插入图片描述

Full GC

如果对象分配内存太快,Mixed GC来不及回收,导致O Region满载,触发一次Full GC。
此阶段会STW,单线程执行标记、清理和压缩整理,因此会导致STW时间过长,需调优尽量避免。(JDK12的Shenandoah GC对此有优化?)

ZGC

先贴一段官方简介:

The Z Garbage Collector, also known as ZGC, is a scalable low latency garbage collector designed to meet the following goals:

  • Sub-millisecond max pause times
  • Pause times do not increase with the heap, live-set or root-set size
  • Handle heaps ranging from a 8MB to 16TB in size

At a glance, ZGC is:

  • Concurrent
  • Region-based
  • Compacting
  • NUMA-aware
  • Using colored pointers
  • Using load barriers

At its core, ZGC is a concurrent garbage collector, meaning all heavy lifting work is done while Java threads continue to execute. This greatly limits the impact garbage collection will have on your application’s response time.

The goal of this project is to create a scalable low latency garbage collector capable of handling heaps ranging from a few gigabytes to multi terabytes in size, with GC pause times not exceeding 10ms.

由此可见,ZGC可满足:亚毫秒级的最大暂停时间、堆空间大小等的增加不会影响效率、堆空间最大可达16T(JDK13由4T增至16T)。
与G1一样,ZGC也基于Region,可与应用程序并行。此外,ZGC的最大暂停时间不超过10毫秒,JDK13新增了将未提交内存还给操作系统的特效。

Region

与G1不同,ZGC不会初始化就分配固定大小,更加动态。
ZGC的Region分为:

  • 小Region(Small Region):容量固定2M,存放<2M的对象。
  • 中Region(Medium Region):容量固定32M,存放>=2M但<4M的对象。
  • 大Region(Large Region):容量不固定,可变,但必须是2M的整数倍,存放>=4M的对象。每个大Region只存放一个对象,GC时直接回收。
    在这里插入图片描述

GC模式

  • 初始标记(Initial Mark):标记从GC Root可达的对象。此阶段会STW。
  • 并发标记(Concurrent Mark):采用颜色指针标记法,标记整个堆空间的可访问的对象。此阶段不会STW。
  • 最终标记(Remark):标记并发标记阶段遗漏或引用发生变化的对象。此阶段会STW。
  • 并发预备重分配(Concurrent Prepare For Relocate):根据特定查询条件扫描所有Region,获取本次回收过程需清理哪些Region,重新组成重分配集(Relocation Set)。此阶段不会STW。
  • 并发初始重分配(Relocate Start):并发重分配阶段的初始化。此阶段会STW。
  • 并发重分配(Concurrent Relocate):将并发预备重分配阶段重分配集中的Region复制到新的Region,并为每个Region维护一个转发表(Forward Table),记录从旧对象到新对象的关系。此阶段不会STW。
  • 并发重映射(Concurrent Remap):将旧地址转换为新地址。此阶段不会STW。
    在这里插入图片描述

一些感悟

  • 虽然绝大多数Java程序猿依然坚守在JDK8,JDK8也越来越稳定,但是,我们还是应拥抱新技术,即使是非LTS版本,每次JDK的大版本新特性和bug修复,还是值得细细品味。
  • 对于GC这件事,STW从1秒到100毫秒、10毫秒,甚至1毫秒,JDK官方依然在不断精进。G1可谓推陈出新,后续诸如ZGC更是基于G1玩出了花,理解难度也随之加深。

一些图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

文末彩蛋

依然来自ZGC官方文档。

What does the “Z” in ZGC stand for?
It doesn’t stand for anything, ZGC is just a name. It was originally inspired by, or a homage to, ZFS (the filesystem) which in many ways was revolutionary when it first came out. Originally, ZFS was an acronym for “Zettabyte File System”, but that meaning was abandoned and it was later said to not stand for anything. It’s just a name.

Is it pronounced “zed gee see” or “zee gee see”?
There’s no preferred pronunciation, both are fine.

作者:曼特宁


http://chatgpt.dhexx.cn/article/sBV76oQJ.shtml

相关文章

Java垃圾收集器之G1

在之前的文章中介绍了JVM的常见垃圾收集器&#xff0c;这边文章我想单独介绍一下G1垃圾收集器。G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征。 G1收集器之内存模型…

【JVM】G1垃圾回收器

1.概述 G1(Garbage First)垃圾收集器是当今垃圾回收技术最前沿的成果之一。早在JDK7就已加入JVM的收集器大家庭中,成为HotSpot重点发展的垃圾回收技术。同优秀的CMS垃圾回收器一样,G1也是关注最小时延的垃圾回收器,也同样适合大尺寸堆内存的垃圾收集,官方也推荐使用G1来代…

jvm之G1 GC

写在前面 jdk9以及之后的版本已经将默认的垃圾收集器parallel更换为G1.本文就一起来看下。 1&#xff1a;G1介绍 parallel GC的设计目标是高吞吐量&#xff0c;CMS GC的设计目标是低延迟&#xff0c;而G1的设计目标不是这二者中的任何一个&#xff0c;其设计目标是让GC的STW…

G1 GC详解及设置

一、概述 G1 GC&#xff0c;全称Garbage-First Garbage Collector&#xff0c;在JDK1.7中引入了G1 GC&#xff0c;从JAVA 9开始&#xff0c;G1 GC是默认的GC算法。通过-XX:UseG1GC参数来启用。G1收集器是工作在堆内不同分区上的收集器&#xff0c;分区既可以是年轻代也可以是老…

java 并g1_JVM G1详解

java程序性能 当我们调优java程序时&#xff0c;通常的目标有两个&#xff1a; 响应能力 或者 吞吐量 响应能力 响应能力指一个程序或者系统对请求的是否能够及时响应。 比如&#xff1a; 一个桌面UI能多快的响应一个事件&#xff1b; 一个网站能够多快返回一个页面请求&#x…

垃圾回收之G1收集过程

G1 中提供了 Young GC、Mixed GC 两种垃圾回收模式&#xff0c;这两种垃圾回收模式&#xff0c;都是 Stop The World(STW) 的。 G1 没有 fullGC 概念&#xff0c;需要 fullGC 时&#xff0c;调用 serialOldGC 进行全堆扫描&#xff08;包括 eden、survivor、o、perm&#xff0…

G1调优分析

目录 1、畅想GC的目标 2、jvm调优的目标 3、GC调优时机 4、垃圾收集器的选择 5、G1调优策略 6、G1垃圾收集实践 6.1、JVM自动选择垃圾收集器 6.2、G1垃圾收集 6.3、GC日志分析 7、小结 前言 c和java之间有一堵由内存动态分配和垃圾收集技术所围成的墙&#xff0c;墙外面的人想进…

JVM垃圾回收器G1详解

1、概述 在我们应用程序所应对的业务越来越庞大、复杂&#xff0c;用户越来越多&#xff0c;没有GC就不能保证应用程序正常进行&#xff0c;而经常造成STW的GC又跟不上实际的需求&#xff0c;我们需要不断地尝试对GC进行优化。G1&#xff08;Garbage-First&#xff09;垃圾回收…

G1垃圾回收器

1、最大堆大小 G1管理的最大堆大小为64G。每个Region的大小通过 -XX:G1HeapRegionSize 来设置&#xff0c;大小为 1~32MB &#xff0c;默认最多可以有2048个Region&#xff0c;G1能管理的最大堆内存是 32MB*204864G 。 使用G1垃圾回收器最小堆内存应为 1MB*20482GB &#xff…

ZGC都出来了,你还不懂G1?

概念 G1&#xff08;Garbage-First Collector&#xff09;是一种垃圾回收算法&#xff0c;最早在JDK 6 Update 14中作为实验性功能加入&#xff0c;并在JDK 7 Update 4正式JDK&#xff0c;之后在JDK 9 中成为默认垃圾回收算法&#xff0c;在JDK 10中优化了Full GC性能。 G1是一…

G1详解

一 G1收集器 g1收集器是一个面向服务端的垃圾收集器适用于多核处理器、大内存容量的服务端系统。 它满足短时间gc停顿的同时达到一个较高的吞吐量。 JDK7以上版本适用 “ 先介绍两个概念&#xff1a;吞吐量和响应能力&#xff0c;响应能力和吞吐量是评价一个系统的两个重要指标…

G1垃圾回收器详解

文章目录 前言一、思考问题二、官方文档三、基本介绍四、G1的内存模型五、G1的标记过程六、G1的垃圾回收1、G1过程梳理2、Young GC3、Mixed GC4、Full GC 七、参数介绍八、分析各阶段触发时机根据GC日志分析Young GC的触发时机根据GC日志分析并发标记的触发时机根据GC日志分析M…

G1 GC

G1GC基本概念 G1 GC可以看做是CMS GC的重大升级改造G1 GC的全称是Garbage-First&#xff0c;意为垃圾优先&#xff0c;哪一块的垃圾最多就优先清理他。G1 GC最主要的设计目标是&#xff1a;将STW停顿的时间和分布&#xff0c;变成可预期且可配置的。&#xff08;默认200ms&…

G1垃圾回收器-----基本知识及原理解析

G1介绍&#xff08;Garbage first&#xff09; G1主要面向的是服务端的垃圾回收器。在G1之前&#xff0c;JVM的主要垃圾回收器采用的是物理分代的思想&#xff0c;将内存区域严格的划分成年轻代&#xff08;young GC&#xff09;和老年代&#xff08;major GC&#xff09;&…

可控硅BT136典型应用电路

1&#xff0e;双向可控硅SCR可根据负载功率大小选择97A6&#xff08;约1A&#xff09;、TLC336A&#xff08;约3A&#xff09;、BT136-500D&#xff08;约6A&#xff09;中的一个&#xff0c;选择原则是触发电流要小于25mA。 2&#xff0e;C4取值在0.1 ~ 0.47uF之间&#xff0c…

全能电子地图实时路况_全能SUV与城市SUV的区别在哪?日产奇骏对比本田皓影

在如今的市场中&#xff0c;越来越多的车企将重点放在SUV车型中&#xff0c;尤其今年大量家用SUV涌入市场&#xff0c;特别是紧凑级SUV将这片市场瓜分的“支离破碎”。即使车型越来越多&#xff0c;市场被瓜分的越来越小&#xff0c;但是在很多消费者心中&#xff0c;几个主流品…

音质卓越颜值在线,五款高人气头戴式HIFI音质蓝牙耳机排名

随着我们生活水平的逐渐提高,我们对科技产品的要求也就越来越高,就拿耳机来说,对于很多上班族或是年轻人耳机绝对是出门或是旅行的必备品之一,没有音乐的路途那绝对是缺少了灵魂,那自然耳机的地位也就越发的重要。无线,音效,小巧,这几个因素也就成为了我们选择耳机的最…

服务器购买及宝塔部署环境说明(阿里云为例)

服务器相关知识 为什么程序员都需要自己的服务器&#xff1f; 1、你作为一个程序员&#xff0c;必须要发部自己的网站和项目&#xff01; 2、联系Linux的操作。 3、自己的远程仓库、远程数据库、远程tomcat…都可以搭建在服务器上 4、联系&#xff0c;Linux进行任意的环境…

Linux学习一概述和环境搭建(入门概述,环境搭建,走近Linux系统)

此文档学习来自b站遇见狂神说&#xff0c;自己做的学习笔记整合。 狂神说Linux 继续Java全栈开发的Linux&#xff0c;而不是运维级别&#xff01; 我们为什么要在这个时间学习Linux&#xff1f;Java全栈开发的我们要掌握哪些知识&#xff1f;需要准备什么工作&#xff1f; J…

CK6855M1蓝牙离线语音识别灯控模组使用说明书

CK6855M1蓝牙离线语音识别灯控模组使用说明书 一、功能说明 CK6855M1模块是一款专为灯具照明产品设计的离线蓝牙语音识别模组。模组支持红外遥控接收&#xff0c;支持RGBWY灯控制&#xff0c;支持无极调光&#xff0c;支持AD按键调灯以及音频上下曲的控制&#xff0c;支持5.1…