图解ZGC

简介: 图解ZGC

简介


支持的版本

image.png


image.png


jdk11版本最大可以支持4TB内存 
jdk13最大可以支持16TB内存
最大停顿时间在10毫秒以内
吞吐量最多降低15%即假设不用ZGC需要1000毫秒才可以回收完
用ZGC最多需要1150毫秒可以回收完
这个影响不大 反正stw时间缩小了

暂时不分代

ZGC底层算法比较🐂,实现分代还比较麻烦,目前还未做到分代
现在还是简单的版本,后续可能会做到分代
即目前还未解决对象生命周期不一致的情况

分代的必要性

对象是有生命周期的
年轻代都是朝生夕死的对象
老年代都是一些老不死的对象
如果老年代和年轻代一样朝生夕死 那还得了
整个堆时时刻刻要做GC

ZGC内存布局

image.png

和G1类似 都是分成一个一个小的内存区域
区别是没有分代的概念了
只有小型、中型、大型的区域区分


重要概念


NUMA

UMA 统一内存访问架构
所有的CPU都同时访问内存
那么就会涉及到内存的争抢
争抢失败会有锁竞争 
即使使用CAS还是有损耗
但是使用UNMA会避免这种情况

image.png

每个cpu访问不同的内存块
每个内存块允许特定cpu具有优先访问权
避免了分配内存和使用内存资源争抢的问题
ZGC底层可以自动识别NUMA架构

ZGC运作过程

image.png

image.png

G1在筛选回收阶段是STW的
Shenandoah基于G1的 相当于G1的升级版本
G1中很多未实现的功能在Shenandoah中都有实现 
比如Shenandoah就在筛选回收阶段实现了并发

并发标记

image.png


G1和CMS在并发标记阶段有一个三色标记
这些标记都在对象头的gc标记上
ZGC不会将标记信息放在对象内部
而是放在对象存储的内存空间那个指针上面
这就是颜色指针


image.png

并发预分配

类比g1的计算回收收益比
看看哪些region需要回收
哪个region回收收益比高
计算好之后 zgc不是马上去清理 g1此时会马上清理
每次gc都会扫描所有的region 
没有g1中的卡表(remember set 记忆集)的维护成本

image.png


并发重分配

将存活对象复制到另一块区域
那么这些对象的引用地址都变了
如果是g1的话筛选回收阶段 因为它是stw的
将对象复制过来之后 就会立马修改引用
但zgc这个过程是和用户线程并发执行的
所以不能直接将老的引用地址修改为新的
zgc是通过读屏障实现的
当读取到老的引用的之后 通过引用中的颜色指针判断引用是否变更
就会将新的引用替换掉老的引用


image.png

image.png


对象变更的几个点

  • 并发标记时新增的对象
将这样的对象用黑色标记 下一次gc过程再回收
  • 并发标记时老的对象状态变更
这部分对象在重新标记或最终标记的过程会修正
比如存活对象变成了垃圾对象就会讲gcroot引用链上剔除
  • 将存活对象复制到新的region区
CMS 并发清理 ,过程中的新增对象用黑色标记 下次gc回收
G1 筛选回收 该过程stw 直接将对象老的地址更新为新的
ZGC 并发重分配 将新-老映射关系记录在转发表 用户线程访问访问老的对象时会通过转发表路由到新的地址

并发重映射过程

该过程就是将gcroot上老的对象引用更新为新的对象引用
这个过程实际上并没有做处理 而是将这个过程放在了下一次gc并发标记中去了
这样就节省了一次遍历对象图的开销
一旦所有指针被修正了之后 原来记录新旧对象关系转发表就可以释放了

颜色指针(染色指针)

image.png

颜色指针不可以被压缩

32位可以做指针压缩 
总共64位 小于等于35位 即<=32G 可以做指针压缩 可以压缩到32位去存储
cpu寻址还是用的35位
真正使用的时候 还要解压缩变成35位才能够寻址到完整的32个g
cpu使用的是是35位 存到内存对象中压缩成32位了
jvm目前实现 最多35位之内的可以做指针压缩
zgc至少用42+4=46位 所以没有办法做指针压缩

读屏障

在并发重新分配阶段 将有效对象复制到另外一个空的region区中
原有的引用地址要更新 (惰性更新)
将从堆中拿老的对象值的时候

image.png


相关文章
|
4月前
|
监控 算法 Java
Java内存管理:垃圾收集器的工作原理与调优实践
在Java的世界里,内存管理是一块神秘的领域。它像是一位默默无闻的守护者,确保程序顺畅运行而不被无用对象所困扰。本文将带你一探究竟,了解垃圾收集器如何在后台无声地工作,以及如何通过调优来提升系统性能。让我们一起走进Java内存管理的迷宫,寻找提高应用性能的秘诀。
|
3天前
|
算法 网络协议 Java
【JVM】——GC垃圾回收机制(图解通俗易懂)
GC垃圾回收,标识出垃圾(计数机制、可达性分析)内存释放机制(标记清除、复制算法、标记整理、分代回收)
|
2月前
|
存储 监控 算法
JVM调优深度剖析:内存模型、垃圾收集、工具与实战
【10月更文挑战第9天】在Java开发领域,Java虚拟机(JVM)的性能调优是构建高性能、高并发系统不可或缺的一部分。作为一名资深架构师,深入理解JVM的内存模型、垃圾收集机制、调优工具及其实现原理,对于提升系统的整体性能和稳定性至关重要。本文将深入探讨这些内容,并提供针对单机几十万并发系统的JVM调优策略和Java代码示例。
64 2
|
2月前
|
算法 JavaScript 前端开发
垃圾回收算法的原理
【10月更文挑战第13天】垃圾回收算法的原理
28 0
|
7月前
|
存储 监控 安全
JVM工作原理与实战(四十):ZGC原理
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了ZGC、ZGC核心技术、ZGC的内存划分、ZGC的执行流程、分代ZGC的设计等内容。
239 1
|
7月前
|
监控 Java Linux
JVM工作原理与实战(三十七):Shenandoah GC和ZGC
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了垃圾回收器的技术演进、Shenandoah GC、ZGC等内容。
173 0
|
存储 算法 安全
15-大厂面试题-JVM垃圾回收采用的是什么算法,有什么区别和优劣?
通过之前的学习,我们知道了JVM会通过**可达性算法**来筛选出哪些对象是可回收的,哪些对象是不可回收的,GCRoots对象是哪些,java的引用类型有哪些以及finlize()方法的作用。同时我们也知道了当一个对象在创建的时候是存放在堆内存中的新生代里的,那么当新生代内存满了后就会触发Minor GC;但是问题是我们如何针对新生代内存进行管理,以及如何进行回收这也是一个值得分析和探讨的问题。
100 0
|
算法 Java
【面试题精讲】为什么G1收集器不需要调优性能也很优秀
【面试题精讲】为什么G1收集器不需要调优性能也很优秀
|
存储 Oracle Java
23-一文带你搞懂G1收集器
G1是一款主要面向服务端应用的垃圾收集器。 HotSpot开发团队最初赋予它的期望是(在比较长期的) 未来可以替换掉JDK 5中发布的CMS收集器。 现在这个期望目标已经实现过半了, JDK 9发布之日, G1宣告取代Parallel Scavenge加Parallel Old组合, 成为服务端模式下的默认垃圾收集器, 而CMS则沦落至被声明为不推荐使用(Deprecate) 的收集器 。
124 0