Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ZGC回收器到底有多变态?

ZGC回收器到底有多变态?

作者头像
ImportSource
发布于 2018-08-14 09:22:11
发布于 2018-08-14 09:22:11
2.8K0
举报
文章被收录于专栏:ImportSourceImportSource

zgc是个什么东东?简单说是个垃圾回收器。

一个低延迟的垃圾回收器!

多少年来,JVM中的各种垃圾回收器都在努力追求着两个目标,暂停时间足够短,同时吞吐量也要不错。为了追求二者兼具,各种垃圾回收器可谓绞尽脑汁,但还是无法同时让两个都足够好,要么暂停时间缩短了但吞吐量下降了,要么吞吐量上去了暂停时间却变长了,真的是操蛋,即使是现在最新的生产可用的G1也是,虽然他也号称是low latency,也可以指定暂停时间,但还是需要你去平衡暂停时间和吞吐量,G1可以说是非常努力了,但还是没有做到极致和傻白甜。

但事情总是发展的,前几天,jdk11的开发团队悄悄的在自己的功能列表中添加了一个叫ZGC的gc。没错,就是我们今天要侃的主角,一个集暂停与吞吐于一身的回收器,听着就是不是被吓尿了,是不是感觉以后都不用对JVM调优了,是不是以后代码可以xjb写了。

来看看它的目标:

看看这些目标!

TB级的堆随便搞!暂停时间10毫秒内!吞吐量最大下降15%!大声告诉我,吓尿没?!

好,继续。

暂停时间不会随着堆的增大而变长!不会!

总体印象

好,接下来,我们还是先对ZGC有个总体上的印象。

1、全新的垃圾回收器。“全新”指的是一点点从草稿然后搞出来,不是基于哪个来优化出来的。

2、使用了Load Barriors技术,而不是使用store Barriors。这是两种不同的技术。store barriors是hotspot里现存的好多垃圾回收器所用的技术。zgc中使用load barrior技术来跟踪堆的状态和对象的状态。

3、单代。它是一个只有一个generation的回收器。

4、Partial Compaction。也是基于部分压缩,这个和G1是一样的。

5、Region-Based GC。它有点像G1,都是基于region,但和G1不一样的是,zgc有更加灵活的region的size schema。这样我们就可以轻松的处理大对象的分配问题了。

6、Immediate Memory Reuse。zgc和G1一样,region们会被及时的清理和压缩和转移,可以让内存的复用更加的及时。

7、NUMA-aware。这是一种内存页合并的硬件技术。

8、Colored Object Pointers。

9、Concurrent。zgc一个非常重要的能力。就是并行和并发干几乎所有的事情。

比如:

  • 1、Marking。
  • 2、Relocation和Compaction。
  • 3、Relocation Set Selection。
  • 4、Reference Processing。
  • 5、JNI WeakRefs Cleaning。
  • 6、StringTable和SymbolTable Cleaning。
  • 7、Class Unloading。

以上这些统统并发(conccurent)搞!zgc团队为他们的这一项能力非常骄傲,这在open jdk的其他垃圾回收器是非常少有的。

目前的状态

1、ZGC目前仅支持Linux/x86_64。

2、性能方面目前是非常牛x的。无论是暂停时间还是吞吐量。

看看一些数字

这是评测结构跑的分数。重点看看蓝色的指标,可以看出ZGC要比Parallel和G1要更好。

再来看看暂停时间的分数:

是不是很夸张。暂停时间远低于他们最初定的目标10ms

GC阶段

这里先放个图,先有个印象,后面会有一个gc过程示例来详细说明。

Heap Regions

堆区域。也被称为:ZPages。

这和G1的region有点像,但和G1不一样的是,region的大小更加灵活和动态。zgc的region不会像G1那样在一开始就被划分为固定大小的region。

zgc的region核心亮点就是:动态。

动态表现为:

  • 1、动态地创建和销毁。
  • 2、动态地决定region的大小。它的最小单位是2MB的一个块。然后每个region的大小就是是2MB*N就是。

而且他有个概念叫:size groups。有三种:

Small:就是一个2MB的region。

Medium:32mb。2MB*16。

Large:N*2MB。

整个heap长这样:

Colored Pointers

是zgc的一个核心概念。你还可以叫它tag pointers,version pointers。

metadata被保存在64-bit的pointer中。目前不支持32位的平台。也不支持CompressedOops。

Virtual Address-masking可以是硬件或操作系统或软件。

先来看看在x86_64上的colored pointer的布局:

一个pointer共64bit。开始的18bit暂时没有被用到(以后有可能要用),然后是四个bit,分别表示Finalizable、Remapped、Marked1、Marked0,这是gc过程中每个对象的状态。最后42bit是用来存储对象的地址。

当是remapped时候,表示不要指向到relocation set(具体relocation set是个什么会在后面的gc示例中说到)中。

当颜色为Finalizable的时候,就只能通过Finalizer来访问到,其他的途径已无法访问。

Linux/x86_64上是Heap Multi-Mapping

下面是在x86_64上的heap中的address space中的pointer们的逻辑映射。

Solaris/SPARC的heap映射:

Solaris/SPARC上是single heap mapping

Load Barrier

Load Barrier主要用于在对象从heap load的时候。而且只在这一个地方用到load barrier。一旦你过了load barrier并成功的拿到了对象,之后你就可以任意的使用它了,比如访问字段,调用方法等。为什么要加入load barrier呢?它的主要目的就是检查pointer是不是“bad color”(前面我们讲到colored pointers)。如果是一个bad color的pointer,那么就需要走一个慢的路径(slow path),然后采取一些措施然后让他变成good color,然后下次你在load的时候,就会走快的路径(fast path),而不需要做额外的措施了。

bad color:mark 、relocate、remap。

good color:repair、heal。

大部分的情况下的对象引用都是good color。

来看看一个例子:

具体的load barrier实现:

如果不是good color并且对象不为null,那么执行slow_path:

GC过程示例

接下来展示一下zgc中的gc过程。

开始示例之前,先说明下,本图的基本元素。含有箭头的线条我们称之为:pointer。然后每个数字表示object。每个方块表示一个region。

首先从roots开始一直往下连通,如果能够直接连通的,我们认为就是可达的,然后标记为红色。

Pause Mark Start

然后标记1为红色,表示ok。

然后标记2为红色。

然后标记4为红色。

Concurrent Mark

现在标记结束了。接下来进入的阶段是“重新分配准备阶段”:Concurrent Prepare for Relocate。

Relocation就是一个转移的过程。

标记过后,我们发现3,6,7是不同的颜色。

Concurrent Prepare for Relocate

标记过后,就需要确定哪些region中的对象被转移。可以发现含有3、6、7的两个region被列为了Relocation Set,意味着这两个region中的对象将会被relocation。

那么4、5、8要被转移到哪里呢?

接下来进入Pause Relocate Start阶段。

Pause Relocate Start

绿色表示Remapped+Relocate的过程。

当来到4的是,发现它属于Relocation Set的对象,于是把4转移到了最右边的那个全新的region中。然后在下面的Forwarding Table中做个记录。

然后进入到Concurrent Relocate阶段。把4转移了?那5和8怎么办呢?

Concurrent Relocate

这个阶段,负责5和8转移到4现在所在的那个region。

现在5已经被转移到了新region。原来3、4、5所在region已经被清理空了,可以重新被使用了。如下:

同样的做法,把8也转移到新的region里。

同样的又一个region被腾空了,可以被重新使用了。

GC Cycle Completed

好,是不是发现2和5已经无法连通了。接下来进入第二阶段的Pause Mark Start。

Pause Mark Start (Second Cycle)

Concurrent Mark (Second Cycle)

Pause Mark End (Second Cycle)

Concurrent Prepare for Relocate (Second Cycle)

可以发现Forwarding Table已被清空。

Stripe Mark

好,你也许好奇,那么多的region,zgc是怎么进行一个个进行回收的呢?上面只是展示了几个对象而已,几个region而已。

这里就要说到zgc的一个宏观的条纹标记技术:Striped Mark。光听到这名词,你也许不知道具体是怎么做的。

这就是条纹,每个条纹的颜色不同。

条纹标记法会把heap逻辑上分成若干个条纹组。然后把每个gc线程都隔离到它自己的stripe上进行gc。

现在假设有四个GC线程。然后Heap如上所示。

然后把heap分为不同颜色的条纹。

然后再抽象一层stripe分组。

不同颜色的条纹由不同的线程来处理。

但有种情况是有的GC线程提前完成了自己所在stripe的清理工作。此时它会加入到其他的stripe上继续帮助其他的gc线程继续清理其他的stripe(这个思路有点类似工作窃取算法)。

好,以上就是全部。ZGC,一个集暂停与吞吐于一身的GC,一个暂停时间控制在10毫秒以内的GC

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ImportSource 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JVM 从入门到放弃之 ZGC 垃圾收集器
Z Garbage Collector,也称为ZGC,在 jdk 11 中引入的一种可扩展的低延迟垃圾收集器,在 jdk 15 中发布稳定版。在旨在满足以下目标:
没有故事的陈师傅
2022/05/23
9190
JVM 从入门到放弃之 ZGC 垃圾收集器
JDK之ZGC介绍
ZGC是最近由Oracle为OpenJDK开源的新垃圾收集器。它主要由Per Liden编写。ZGC类似于Shenandoah或Azul的C4,专注于减少暂停时间的同时仍然压缩堆 。
张哥编程
2024/12/19
1350
JVM之垃圾回收器
有了虚拟机,就一定需要收集垃圾的机制,这就是Garbage Collection,对应的产品我们称为Garbage Collector。
Java微观世界
2025/01/20
1830
JVM之垃圾回收器
Shenandoah GC:一个来自JDK12的全新并发压缩垃圾回收器
是不是才听说了JDK11的ZGC,并且还没搞懂?不好意思,OpenJDK12马不停蹄的带来了Shenandoah GC。
Java_老男孩
2019/12/02
1.5K0
CMS(Concurrent Mark-Sweep)垃圾回收器
在现代Java应用中,垃圾回收(Garbage Collection, GC)是性能优化的关键之一。它自动管理内存,避免内存泄漏和手动管理的复杂性。CMS(Concurrent Mark-Sweep)是一种低延迟的垃圾回收器,设计用于减少应用程序停顿时间。
九转成圣
2024/08/05
1520
从源码中探索新一代垃圾回收器 ZGC
笔者经过上次对zgc在不同环境下进行的测试后,发现zgc所带来的提升非常之大。一时间对zgc在生产中使用充满信心,但是在全面使用之前,难免对其几大新特性有一些好奇,比如:染色指针,读屏障,动态region,支持NUMA等等。其中有一些是比较好理解的,但是有一些例如染色指针,读屏障刚接触的时候会不明其意。在网上搜索一番后发现很多文档都只是简单一笔盖过,或者只介绍个概念,甚至还有错误或者模糊的介绍,具体的实现和意义最让笔者好奇,但又找不到答案。所以笔者在经过一段时间的ZGC源码学习后,在此做一番总结。
张乘辉
2021/08/06
1.4K0
亚毫秒GC暂停到底有多香?JDK17+ZGC初体验|得物技术
垃圾回收器的暂停问题一直是Java工程师关注的重点,特别是对实时响应要求较高的服务来说,CMS和G1等主流垃圾回收器的数十毫秒乃至上百毫秒的暂停时间相当致命。此外,调优门槛也相对较高,需要对垃圾回收器的内部机制有一定的了解,才能够进行有效的调优。
得物技术
2023/06/16
2.1K0
亚毫秒GC暂停到底有多香?JDK17+ZGC初体验|得物技术
jvm之垃圾回收篇(二)
在对象中添加一个引用计数 器,当有地方引用这个对象的时候, 计数器+1,当失效的时候,计数器-1
周杰伦本人
2022/10/25
2820
jvm之垃圾回收篇(二)
ZGC关键技术分析
垃圾回收对于Javaer来说是一个绕不开的话题,工作中涉及到的调优工作也经常围绕垃圾回收器展开。面对不同的业务场景没有一个统一的垃圾回收器能保证可GC性能。因此对程序员来说不仅要会编写业务代码,同时也要卷一下JVM底层原理和调优知识。这种局面可能因为ZGC的出现而发生改变,新一代回收器ZGC几乎不需要调优的情况下GC停顿时间可以降低到亚秒级。
得物技术
2023/10/19
4700
ZGC关键技术分析
深入理解JVM - ZGC垃圾收集器
如果下面的一些概念有些不清楚的可以先看深入理解JVM - 垃圾收集器和深入理解JVM - Shenandoah垃圾收集器。
会呼吸的Coder
2020/02/17
1.2K0
jvm 垃圾回收器比较_jvm有哪些垃圾回收算法
垃圾回收器的发展过程是随着内存越来越大的过程而演进的。 从分代算法演化到不分代算法。
全栈程序员站长
2022/10/03
4530
jvm 垃圾回收器比较_jvm有哪些垃圾回收算法
大厂面试题:有了 G1 还需要其他垃圾回收器吗?
我们在上一篇中,简要的介绍了 CMS 垃圾回收器,下面我们简单回忆一下它的一个极端场景(而且是经常发生的场景)。
小熊学Java
2023/09/19
3480
大厂面试题:有了 G1 还需要其他垃圾回收器吗?
一文了解JVM全部垃圾回收器,从Serial到ZGC
前文介绍了垃圾回收的基础算法,相当于垃圾回收的方法论。接下来就详细看看垃圾回收的具体实现。
Zack说码
2019/08/05
5930
一文了解JVM全部垃圾回收器,从Serial到ZGC
干货 | 一文看懂JVM内存布局及GC原理
杨俊明,携程云客服平台研发部软件技术专家。从事IT行业10余年,腾讯云+社区、阿里云栖社区、华为云社区认证专家。近年来主要研究分布式架构、微服务、java技术等方向。
携程技术
2019/08/29
1.2K0
干货 | 一文看懂JVM内存布局及GC原理
深入解析ZGC垃圾回收器
ZGC有人称它为Zero GC,其实「Z」并非什么专业名词的缩写,这款收集器的名字就叫作Z Garbage Collector。
BookSea
2023/08/29
6000
深入解析ZGC垃圾回收器
JVM内存布局及GC知识回顾
按java 8虚拟机规范的原始表达:(jvm)Run-Time Data Areas, 暂时翻译为"jvm运行时内存布局"。
菩提树下的杨过
2019/06/15
6720
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 系列(5) —— 垃圾收集器
这三个指标也被称为不可能的三角,即无法做到三者间的,随着硬件性能的提升,人们反而可以容忍内存占用的扩大,对延迟的容忍度反而降低。
求和小熊猫
2020/12/29
3280
JVM - ZGC初探
ZGC是一款JDK 11中新加入的具有实验性质的低延迟垃圾收集器,ZGC源自于是Azul System公司开发的C4(Concurrent Continuously Compacting Collector) 收集器。
小小工匠
2021/08/17
3890
ZGC垃圾收集器-JVM(十五)
上篇文章说了G1的特性,无分代,复制算法,大内存就可以用G1,可预测stw时间等特性。
用户9919783
2023/09/05
2670
ZGC垃圾收集器-JVM(十五)
相关推荐
JVM 从入门到放弃之 ZGC 垃圾收集器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档