Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ZGC关键技术分析

ZGC关键技术分析

原创
作者头像
得物技术
发布于 2023-10-19 06:42:41
发布于 2023-10-19 06:42:41
4690
举报
文章被收录于专栏:得物技术得物技术

一、引言

垃圾回收对于Javaer来说是一个绕不开的话题,工作中涉及到的调优工作也经常围绕垃圾回收器展开。面对不同的业务场景没有一个统一的垃圾回收器能保证可GC性能。因此对程序员来说不仅要会编写业务代码,同时也要卷一下JVM底层原理和调优知识。这种局面可能因为ZGC的出现而发生改变,新一代回收器ZGC几乎不需要调优的情况下GC停顿时间可以降低到亚秒级。

Oracle从JDK11开始正式引入ZGC,ZGC设计三大目标:

  • 支持TB级内存 (8M~4TB) 。
  • 停顿时间控制在10ms之内 (生产环境实际观测在微秒级) ,停顿不会随着堆的大小,或者活跃对象的大小而增加。
  • 对程序吞吐量影响小于15%。

ZGC是如何设计怎么达到这个目标的呢?本文将从ZGC算法的关键特性入手,通过分析ZGC周期处理过程来理解这些特性,探索ZGC设计思想。

二、ZGC术语

非分代:将对内存划分为新生代和老年代 (G1已经逻辑分代) ,ZGC取消分代设计,每个GC周期都将标记整个堆中的所有活动对象。

页面: ZGC将堆空间分解成一块块区域,这些区域叫做页面,ZGC通过页面来回收内存。

并发性: GC和线程和业务线程同时运行 ZGC的高度并发设计,几乎所有GC工作、标记和堆碎片整理都是和业务线程 (mutators) 同时运行的,只包含了短暂的STW同步暂停。

并行: 多个线程进行GC线程同时工作,加快回收速度。

标记-复制算法: 标记-复制算法主要包括以下3个过程。

  • 标记阶段,即从GC Roots集合开始,分析对象可达性,标记出活跃对象。
图1:可达性分析后对象的引用状态
图1:可达性分析后对象的引用状态
  • 对象转移阶段,即把活跃对象复制到新的内存地址上。
  • 重定位阶段,因为转移导致对象的地址发生了变化,在重定位阶段,所有指向对象旧地址的指针都要调整到对象新的地址上。

标记-复制算法的最大优势就是防止堆内存碎片化的出现,复制的过程就可以对堆内存进行整理。ZGC、CMS和G1都是采用了标记-复制算法,但是不同的实现导致了很大的性能差异。

三、ZGC性能数据

ZGC设计致力于提供几毫秒的最大暂停时间,同时保证吞吐量不受影响。下面是SPECjbb2015针对OpenJDK中的不同收集器运行的性能测试数据。在128G堆内存下,无论是延迟还是吞吐量上面ZGC的性能表现都高于其他收集器。

图2:SPECjbb2015GC性能评分
图2:SPECjbb2015GC性能评分
图3: SPECjbb2015GC延迟比较
图3: SPECjbb2015GC延迟比较

四、ZGC关键特性

ZGC的周期是高度并发的,并发性越高意味着GC工作时对业务线程的影响越小,SPECjbb2015的性能报告可以看出ZGC在延迟上比G1低10倍以上,ZGC的工作周期只有三个阶段是STW的,其他阶段完全并发。这得益于ZGC在堆视图并发一致性设计上的改进。我们都清楚在并发的场景下需要协调各个线程对共享资源达成一致性,常用的手段就是对资源加锁,而在垃圾回收器下的思路也是类似,如果GC线程工作是需要锁定对象资源进行处理,业务线程则需要全部暂停,这就产生了STW (Stop The Word) 。以往的垃圾回收器都是让GC线程和业务线程就堆中对象地址达成一致,对象在发生转移时业务线程是不能访问的 (因为对象的地址发生了变化) ,无论G1还是CMS对象在进行复制时都是需要STW。ZGC使用到的着色指针(Colored Pointer)和读屏障(Load Barrier)技术,可以让所有线程在并发的条件下就指针的颜色 (状态) 达成一致,而不是对象地址。因此,ZGC可以并发的复制对象,这大大的降低了GC的停顿时间。我们先对着色指针和读屏障有个初步的理解,然后在通过ZGC回收周期来看这2项技术的具体运用。

着色指针(Colored Pointer)

在指针中嵌入元数据(使用地址中的高阶位来实现),这种通过在指针存储元数据的技术就叫做着色指针 (Colored Pointer) 。ZGC中指针始终是64位结构,由元位(指针的颜色)和地址位组成。地址位数决定了理论上支持的最大堆大小,ZGC使用42位存储地址也就意味着ZGC最大支持4TB堆内存。如图所示,低42位是地址位,中间4位是元位,高18位未使用。四个元位是Finalized ( F )、Remapped ( R )、Marked1 ( M1 ) 和Marked0 ( M0 )。

图4: 64位地址使用示意图
图4: 64位地址使用示意图

ZGC中将指定上的标记通过颜色来表示,颜色可以是“good” (地址有效) 或“bad” (地址可能无效) 。指针的颜色由其元位的状态决定:F、R、M1和M0。“good”是R、M1、M0元位中的一个被设置,另外三个未设置,比如0100、0010和 0001属于“good”颜色。通过在指针上的颜色就能区分出对象状态,不用额外做内存访问,这使得ZGC在标记和转移阶段会更快。

通过设置地址元位的状态,可以形成不同地址视图,ZGC同一物理堆内存被映射到虚拟地址空间三次,从而产生同一物理内存的三个“视图”,GC活动的不同时期会只存在一个活跃视图,根据垃圾回收的周期ZGC通过切换不同视图标来记出对象的颜色。

下图是虚拟地址的空间划分:

图5:虚拟地址空间划分和多视图映射
图5:虚拟地址空间划分和多视图映射

[0~4TB) 对应Java堆;

[4TB ~ 8TB) 称为M0地址空间;

[8TB ~ 12TB) 称为M1地址空间;

[12TB ~ 16TB) 预留未使用;

[16TB ~ 20TB) 称为Remapped空间。

ZGC是不分代的,这意味着垃圾回收是需要扫描整个堆空间,地址视图将整个Java堆分成多个部分,并为每个部分分配一个虚拟内存段。在垃圾回收时,ZGC只需要扫描其中一个虚拟内存段,并将其作为当前视图映射到实际的内存位置。同时,ZGC会将其他虚拟内存段映射到虚拟地址上,这些内存段不会被收集器扫描。

读屏障(Load Barrier)

ZGC 通过利用读屏障而不是写入屏障,与HotSpot JVM中以前的GC (CMS,G1等) 算法显著不同。读屏障解决了并发转移时对象指针更新问题:在转移期间,如果移动对象而不用更新引用对象的传入指针(移动的对象可能被堆中的任何其他对象所引用),就会产生悬空指针 (已经被释放的内存空间或者无效的内存地址,访问悬空指针会出现问题) 。通过读屏障技术能够捕获此类悬空指针对象,并触发代码,更新对象的新位置,从而“修复”悬空指针。为了跟踪对象如何移动,以便在加载时固定悬空指针,ZGC中使用转发表 (forwarding tables ) 来将重定位前(旧)地址映射到重定位后(新)地址。无论是业务线程作为使用者访问对象,还是GC线程遍历堆中的所有活动对象(在标记期间)都有可能会触发读屏障。

ZGC读屏障如何实现呢?举个例子,代码 var x = obj.field。x是一个位于堆栈上的局部变量,field是一个位于堆上的指针。业务线程在操作堆对象时触发读屏障。读屏障的执行路径有快 (fast path) 和慢 (slow path) 两种,如果正在加载的指针有效状态 (good color) ,则采用加载屏障的快速路径,否则,采用慢速路径。快速路径实际上是空的,而慢速路径包含计算有效状态指针的逻辑:检查对象是否已经(或即将)重新定位,如果是,则查找或生成新的地址。读屏障除了能让触发读屏障的线程读取到最新地址,同时还具有自我修复指针(self-healed)的功能,这意味着读屏障会修改指针的状态,以便后续其他线程访问时能执行快速路径。无论采用哪条路径,都会返回正确状态的地址。下面用伪代码表示ZGC在执行读屏障时的大体逻辑:

代码语言:txt
AI代码解释
复制
/**
slot 是值线程栈中的局部变量,也就是屏障要操作的目标对象
*/
unintptr_t barrier(unintptr_t *slot,unintptr_t addr){
    //快速路径,fast path
    if(is_good_or_null(addr))return addr;
    //慢速路径,slow path
    good_addr = process(addr);
    //自我修复
    self_heal(slot,addr,good_addr);
    return good_addr;
}
/*
自我修复,将指针恢复到正常状态
*/
void self_heal(unintptr_t *slot,unintptr_t old_addr,unintptr_t new_addr){
    if(new_addr == 0)return;
    while(true){
        if(CAS(slot,&old_addr,new_addr)
        return;
        if(is_good_or_null(old_addr))
        return;
    }
}

ZGC的读屏障可能被GC线程和业务线程触发,并且只会在访问堆内对象时触发,访问的对象位于GC Roots时不会触发,这也是扫描GC Roots时需要STW的原因。

下面是一个简化的示例代码,展示了读屏障的触发时机。

代码语言:txt
AI代码解释
复制
Object o = obj.FieldA   // 从堆中读取引用,需要加入屏障
<Load barrier>
Object p = o  // 无需加入屏障,因为不是从堆中读取引用
o.dosomething() // 无需加入屏障,因为不是从堆中读取引用
int i =  obj.FieldB  //无需加入屏障,因为不是对象引用

五、ZGC执行周期

如下图 所示,ZGC 周期由三个 STW 暂停和四个并发阶段组成:标记/重新映射( M/R )、并发引用处理( RP )、并发转移准备( EC ) 和并发转移( RE )。为了读者能快速理解,下面对ZGC执行过程进行了大量简化。

图6:ZGC周期表示
图6:ZGC周期表示

初始标记(STW1)

ZGC 初始标记执行包含三个主要任务。

  • 地址视图被设置成M0 (或M1) ,M0还是M1根据前一周期交替设置的。
  • 重新分配新的页面给业务线程创建对象,ZGC只会处理当前周期之前分配的页面。
  • 初始标记只会存活的根对象被标记为M0 (M1) ,并被加入标记栈进行并发标记。

GC周期中地址视图窗口

图7:ZGC周期中状态窗口划分
图7:ZGC周期中状态窗口划分

并发标记(M/R)

并发标记的任务有2个:

第一,并发标记线程从待标记的对象列表出发,根据对象引用关系图遍历对象的成员变量,递归进行标记。

第二,计算,并更新关联页面的活跃度信息。活动信息是页面上的活动字节数,用于选择将要回收的页面,这些对象将作为堆碎片整理的一部分进行重新定位。

下面伪代码是并发标记的主要过程:

代码语言:txt
AI代码解释
复制
while(obj in mark_stack){
    //标记存活对象,当且仅当该对象未被标记并且当前线程成功标记该对象时才返回true
    success = mark_obj(obj);
    if(success){
        for(e in obj->ref_fields()){
            MarkBarrier(slot_of_e,e);
        }
    }
}
//GC线程调用
//EC是待回收页面的集合
void MarkBarrier(uintptr_t *slot,unintptr_t addr){
    if(is_null(addr))return;
    //判断是否在待回收集合内
    if(is_pointing_into(addr,EC)){
        //地址重映射到当前GC视图
        good_addr = remap(addr);
    } else {
        good_addr = good_color(addr);
    }
    //访问的对象添加到标记栈
    mark_stack->add(good_addr);
    self_heal(slot,addr,good_addr);
}

//读屏障前面有介绍过,由业务线程调用
void LoadBarrier(uintptr_t *slot,unintptr_t addr){
    if(is_null(addr))return;
    if(is_pointing_into(addr,EC)){
        good_addr = remap(addr);
    } else {
        good_addr = good_color(addr);
    }
    mark_stack->add(good_addr);
    self_heal(slot,addr,good_addr);
    return good_addr;
}

代码片段显示了并发标记阶段的GC线程主循环。mark_obj()当且仅当该对象未被标记并且当前线程成功标记该对象时才返回 true。它在内部使用原子操作(compare and swap,CAS)来设置位图中的位,因此它是线程安全的。MarkBarrier()遍历该对象的成员属性,完成对象引用的标记。并发标记时业务线程也在运行,此前如果业务线程访问对象将执行LoadBarrier()协助GC线程完成对象标记。

再标记阶段(STW2)

再标记阶段的主要任务有3个:

  • 执行修复任务,指线程运行C2编译的代码,在进入再标记阶段时可能发生漏标。
  • 结束标记,并发标记后业务线程本地标记栈可能存在待标记的对象,执行本步骤的目的就是对这些待标记对象进行标记。
  • 执行部分非强根并行标记。

并发转移准备(EC)

并发转移准备任务:

  • 筛选所有可以被回收的页面
  • 选择垃圾比较多的页面作为页面转移集

初始转移(STW3)

初始转移主要以下过程:

  • 调整地址视图:将地址视图从M0或者M1调整为Remapped,说明进入真正的转移,此后所有分配的对象视图都是Remapped。
  • 重定位TLAB:因为地址视图调整,所以要调整TLAB中地址的视图。
  • 开始转移:从根集合出发,遍历根对象的直接引用的对象,对这些对象进行转移。

初始转移是STW的,其处理时间和GC Roots的数量成正比,一般情况耗时非常短。

并发转移(RE)

初始转移完成了GC Roots对象重定位,在并发转移阶段将对前面步骤确定的转移集 (EC) ,对转移集的每一页执行转移。

并发转移的过程可以抽象成如下伪代码过程:

代码语言:txt
AI代码解释
复制
//GC线程主循环遍历EC的页面,将个将EC集页面中对象进行转移
for (page in EC){
    for(obj in page){
        relocate(obj);
    }
}
//该方法GC和业务线程都有可能执行,如果是业务线程访问对象会先进行转移在进行操作
unintptr_t relocate(unintptr_t obj) {
    //获取对象的地址转发表
    ft = forwarding_tables_get(obj);
    if (ft->exist(obj)){
        return ft->get(obj);
    }
    new_obj = copy(obj);
    //CAS写对象转发表数据
    if(ft->insert(obj,new_obj)){
        return new_obj;
    }
    //CAS发生竞争,写转发表失败,释放分配的内存
    dealloc(new_obj)
    return ft->get(obj);
}

转发表的作用是存储对转移后旧地址到新地址的映射,转发表的数据存储在页面中,转移完成的页面即可被回收掉。

并发转移完成之后整个ZGC周期完成。

六、ZGC算法演示

为了说明ZGC算法,下图演示了示例中的所有阶段。

图8:ZGC算法演示
图8:ZGC算法演示

图8(1)显示了堆的初始状态,应用启动后ZGC完成了初始化。

在图8(2)中,选择M0作为全局标记,并且所有根指针都被标记成M0。然后,所有根都被推送到标记堆栈,该标记堆栈在并发标记 (M/R) 期间由GC线程消耗。

如图8(3)所示,图中用合适的颜色绘制对象本身,以表明它们已被标记,即使指针有状态。

在图8(4) 中,选择存活对象最少的页面(中间的页面)作为转移候选集 (EC) 。

随后,在图8(5)中,全局标记被设置为Remmaped,并且所有根指针都已更新Remmaped。如果根指向EC,则相应的对象将被重新定位,并且根指针更新为新地址。

在图8(6)中,EC中的对象被转移,并且地址记录被逐出页面中转发表上,用于新旧地址转换。当并发转移阶段结束时,当前GC周期也会结束。当前周期内整个EC都会被回收。这里可能有个疑问,对象的旧地址还没有更新,页面如果被回收了如何还能访问对象呢?原因是回收的是页面中对象存储空间,转发表不会被回收,如果此时业务线程访问这些对象,会触发读屏障的慢路径位,失效指针会被修复。对于没有访问到的失效指针,直到下一个GC并发标记 (M/R) 阶段才会被修复。

在图8(7)中,下一个GC循环开始,M1被选择为全局状态(M0 和 M1 之间交替使用)。

在图8(8)中,并发标记阶段 (M/R) 通过查询转发表失效的指标被映射到新位置。

最后,在图8(9)中,上一周期EC页面的转发表被回收,为即将到来的并发转移 (RE) 阶段做准备。

七、总结

ZGC是一个十分复杂的JVM子系统,没办法通过一篇文章把所有的细节描述清楚。本文详细探讨了ZGC的着色指针和读屏障关键技术,他们也是ZGC中创新点,最后通过一个示例对ZGC算法过程做了一个简化版的演示。通过对ZGC这种复杂系统的学习,让我也体会到分析复杂系统时没必要一开始就过多的纠结实现细节,可以先从关键流程入手再层层深入。

ZGC的高并发设计造就了它的高性能,背后要归功于着色指针和读屏障运用,当然除了这2项还有其他精妙的设计比如:内存模型,并发模型,预测算法等这里不展开,读者可以参考其他文章。了解ZGC的基本原理可以帮助优化应用程序的性能,为应用调优做些知识储备。最后,ZGC有卓越的性能和稳定性表现,我们在选择GC选型时可以优先考虑使用ZGC。

参考内容:

1. 彭成寒:《新一代垃圾回收器ZGC设计与实现》.机械工业出版社, 2019.

2. https://tech.meituan.com/2020/08/06/new-zgc-practice-in-meituan.html

3. https://www.baeldung.com/jvm-zgc-garbage-collector

4. https://openjdk.org/projects/zgc/

5. https://www.jfokus.se/jfokus18/preso/ZGC--Low-Latency-GC-for-OpenJDK.pdf

*文 / byteyangyang

本文属得物技术原创,更多精彩文章请看:得物技术官网

未经得物技术许可严禁转载,否则依法追究法律责任!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
我所理解的 Go 的 GC (Garbage Collection) 垃圾回收机制
Go 语言(Golang)作为一款内置运行时的现代编程语言,其垃圾回收(Garbage Collection, GC)机制是开发者理解其性能和行为的关键一环。要深入理解 Go 的 GC,我们首先需要明确垃圾回收的核心任务是什么,以及它在设计上需要面对哪些权衡与博弈。
Piper破壳
2025/05/27
1380
我所理解的 Go 的 GC (Garbage Collection) 垃圾回收机制
Java最新前沿技术:ZGC垃圾收集器
ZGC(The Z Garbage Collector)是JDK 11中推出的一款追求极致低延迟的实验性质的垃圾收集器,它曾经设计目标包括:
程序员小猿
2021/01/19
1.1K1
12 张图带你彻底理解 ZGC
ZGC(Z Garbage Collector) 是一款性能比 G1 更加优秀的垃圾收集器。ZGC 第一次出现是在 JDK 11 中以实验性的特性引入,这也是 JDK 11 中最大的亮点。在 JDK 15 中 ZGC 不再是实验功能,可以正式投入生产使用了,使用 –XX:+UseZGC 可以启用 ZGC。
jinjunzhu
2022/09/23
7870
12 张图带你彻底理解 ZGC
why哥带你看看ZGC到底是个什么鬼玩意?
像 CMS 就是分离出一些阶段使得应用线程可以和垃圾回收线程并发,当然还有利用回收线程的并行来减少停顿的时间。
why技术
2020/11/25
1.1K0
why哥带你看看ZGC到底是个什么鬼玩意?
从历代GC算法角度剖析ZGC
Tech 导读 本文所有介绍仅限于HotSpot虚拟机,首先介绍了垃圾回收的必要手段,基于这些手段讲解了历代垃圾回收算法是如何工作的, 每一种算法不会讲得特别详细,只为读者从算法角度理解工作原理,从而引出ZGC,方便读者循序渐进地了解。
京东技术
2023/09/21
5750
从历代GC算法角度剖析ZGC
新一代垃圾回收器ZGC的探索与实践
很多低延迟高可用Java服务的系统可用性经常受GC停顿的困扰,作为新一代的低延迟垃圾回收器,ZGC在大内存低延迟服务的内存管理和回收方面,有着非常不错的表现。
美团技术团队
2020/08/11
1.3K0
ZGC垃圾收集器原理分析
zgc只支持64位系统,然后最大支持4T的堆内存,64位指针只需要使用42位就可以寻址4TB的空间,这意味着有多余的22位可以利用。zgc利用了4位,分别用来表示:是否已经finalize,重映射(remap),mark0,mark1。 mark0与mark1表示是否被标记,在gc周期性更换,这样可以不要重复去复原(就像以前survivor的复制回收算法,也就是这次用mark0表示,下次就用mark1,在用mark1标记时顺便把mark0复原,在用mark0标记时顺便把mark1复原)。
歪歪梯
2020/06/19
1.2K0
ZGC垃圾收集器原理分析
JVM 从入门到放弃之 ZGC 垃圾收集器
Z Garbage Collector,也称为ZGC,在 jdk 11 中引入的一种可扩展的低延迟垃圾收集器,在 jdk 15 中发布稳定版。在旨在满足以下目标:
没有故事的陈师傅
2022/05/23
9040
JVM 从入门到放弃之 ZGC 垃圾收集器
JDK之ZGC介绍
ZGC是最近由Oracle为OpenJDK开源的新垃圾收集器。它主要由Per Liden编写。ZGC类似于Shenandoah或Azul的C4,专注于减少暂停时间的同时仍然压缩堆 。
张哥编程
2024/12/19
1340
Shenandoah GC算法
最早由Red Hat公司发起,目标是利用现代多核CPU的优势,减少大堆内存在GC时产生的停顿时间。随OpenJDK 12一起发布,暂停时间不依赖于堆的大小;这意味着无论堆的大小如何,暂停时间都是差不多的。
johnny666
2024/10/04
1080
一颗米-ZGC可伸缩低延迟垃圾收集器深度解析
随着Java应用的日益复杂和数据量的不断增长,垃圾收集(GC)的性能和效率变得尤为关键。ZGC(Z Garbage Collector)是Java 11中引入的一款可伸缩、低延迟的垃圾收集器,它旨在满足大规模堆内存和高吞吐量应用的需求。本文将详细探讨ZGC的工作原理、特性、性能优势以及实际使用中的代码示例,帮助读者更好地理解和应用这一革命性的垃圾收集技术。
灬沙师弟
2024/04/10
3330
一颗米-ZGC可伸缩低延迟垃圾收集器深度解析
从源码中探索新一代垃圾回收器 ZGC
笔者经过上次对zgc在不同环境下进行的测试后,发现zgc所带来的提升非常之大。一时间对zgc在生产中使用充满信心,但是在全面使用之前,难免对其几大新特性有一些好奇,比如:染色指针,读屏障,动态region,支持NUMA等等。其中有一些是比较好理解的,但是有一些例如染色指针,读屏障刚接触的时候会不明其意。在网上搜索一番后发现很多文档都只是简单一笔盖过,或者只介绍个概念,甚至还有错误或者模糊的介绍,具体的实现和意义最让笔者好奇,但又找不到答案。所以笔者在经过一段时间的ZGC源码学习后,在此做一番总结。
张乘辉
2021/08/06
1.4K0
ZGC介绍
什么是ZGC ZGC收集器(Z Garbage Collector)由Oracle公司研发.2018年提交了JEP 333将ZGC提交给了OpenJDK,推动进入OpenJDK11的发布清单中。ZGC收集器是基于Region内存布局,暂时不设分代,使用读屏障,着色指针和内存多重映射等技术来实现并发的标记整理算法,以低延迟为目标的一款收集器。 目标 在对吞吐量影响不大的情况下,对任意大小堆收集停顿时间都控制在10ms以内的低延迟。 ZGC堆内存布局 与G1一样,ZGC也采用基于Region的堆内存布局 ZGC
开源日记
2020/12/07
1.8K0
Java ZGC 深度剖析及其在构建低延迟流系统中的实践心得
在 Java 应用程序中,垃圾回收(Garbage Collection,以下简称 GC)是一个不可避免的过程,它负责释放不再使用的内存空间以避免内存泄漏。然而,GC 操作通常会导致短暂的停顿时间(Stop the World,以下简称 STW),这对于对延迟敏感的应用程序来说是一个严重的问题——STW 会导致应用程序暂停响应,从而影响用户体验和系统性能。为了解决这个问题,Java 引入了 Z Garbage Collector(以下简称 ZGC),它是一种低延迟垃圾回收器,旨在减少 GC 引起的停顿时间。ZGC 通过使用并发和分区收集技术,大大减少了 STW 的时间和频率,使得应用程序可以在 GC 期间继续运行,从而提供更加平滑和一致的性能。AutoMQ 基于 ZGC 进行了一系列调优,以获得更低的延迟。在本文中,我们将详细介绍 ZGC 的工作原理,以及如何通过调整和优化 ZGC 的配置来实现更低的延迟,从而提高 Java 应用程序的性能和响应能力。
用户10807116
2024/07/09
3940
深入理解JVM - ZGC垃圾收集器
如果下面的一些概念有些不清楚的可以先看深入理解JVM - 垃圾收集器和深入理解JVM - Shenandoah垃圾收集器。
会呼吸的Coder
2020/02/17
1.2K0
第七篇 : ZGC 垃圾收集器
Java 11包含一个全新的垃圾收集器--ZGC,它由Oracle开发,承诺在数TB的堆上具有非常低的暂停时间。 在本文中,我们将介绍开发新GC的动机,技术概述以及由ZGC开启的一些可能性。
程序员果果
2019/05/23
7310
深入解析java虚拟机:垃圾回收,ShenandoahGC及并发垃圾 回收器
在Shenandoah GC之前的所有垃圾回收器都必须主动或者被动地整理老年代或者新生代,因此会导致长时间的STW,对于大型的堆,比如超过100GB,所有现存的垃圾回收器几乎都表现得很差。为了解决这些问题,Red Hat开发了一个低停顿的并发垃圾回收器,并于JEP 189贡献给了OpenJDK社区,目前Shenandoah GC仍然属于实验性特性,需要使用参数-XX:+ UnlockExperimentalVMOptions -XX:+UseShenandoahGC开启。
愿天堂没有BUG
2022/10/31
8250
深入解析java虚拟机:垃圾回收,ShenandoahGC及并发垃圾 回收器
亚毫秒GC暂停到底有多香?JDK17+ZGC初体验|得物技术
垃圾回收器的暂停问题一直是Java工程师关注的重点,特别是对实时响应要求较高的服务来说,CMS和G1等主流垃圾回收器的数十毫秒乃至上百毫秒的暂停时间相当致命。此外,调优门槛也相对较高,需要对垃圾回收器的内部机制有一定的了解,才能够进行有效的调优。
得物技术
2023/06/16
2.1K0
亚毫秒GC暂停到底有多香?JDK17+ZGC初体验|得物技术
深入理解HotSpot源码:CMS、C1与ZGC的区别
作为一名资深架构师,深入理解HotSpot虚拟机中的垃圾收集器CMS、编译器C1以及新一代垃圾收集器ZGC,对于构建高效、可靠的Java应用至关重要。本文将通过背景介绍、业务场景分析、功能点阐述及Java源码示例,带您深入探讨这三者的区别。
小马哥学JAVA
2024/10/20
1990
ZGC垃圾收集器-JVM(十五)
上篇文章说了G1的特性,无分代,复制算法,大内存就可以用G1,可预测stw时间等特性。
用户9919783
2023/09/05
2660
ZGC垃圾收集器-JVM(十五)
相关推荐
我所理解的 Go 的 GC (Garbage Collection) 垃圾回收机制
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档