ZGC 垃圾回收过程

news2024/11/26 19:55:31

ZGC(Z Garbage Collector)是Java平台上的一种垃圾收集器,它是由Oracle开发的,旨在解决大堆的低延迟垃圾收集问题。ZGC是一种并发的分代垃圾收集器,它主要针对具有大内存需求和低停顿时间要求的应用程序

ZGC的核心概念及对应的JVM参数详见 分代ZGC详解

分代ZGC收集器具备以下特性:

  • 没有多重映射内存
  • 内存屏障优化
  • 双重缓冲记忆集
  • 无需额外堆内存重分配
  • 堆区域密度
  • 大对象处理

ZGC 垃圾回收过程

ZGC使用了一种称为并发压缩的技术,在垃圾回收过程中进行垃圾对象的压缩和内存整理。下面是ZGC垃圾回收的大致过程:

  1. 初始标记:ZGC会标记出所有的根对象,包括线程栈上的引用、静态变量和一些特殊的对象。初始标记的目的是确定一组初始的存活对象,以便在后续的并发标记和重定位阶段中进行处理
  2. 并发标记/对象重定位:并发地遍历堆中的对象,并标记出这些对象的存活状态。同时,ZGC会将存活对象从旧的内存区域重定位到新的内存区域,以便为后续的对象分配提供更大的连续空间。这个阶段的并发执行可以减少垃圾回收对应用程序的停顿时间
  3. 再标记:在并发标记阶段期间,应用程序可能会继续产生新的对象,而这些新对象也需要被标记为存活。因此,ZGC需要进行一次再标记阶段,以标记并更新在并发标记期间产生的新对象
  4. 并发转移准备:在并发转移准备阶段,ZGC会准备进行并发的对象转移。这包括处理与并发标记阶段重叠的一些操作,例如更新引用和处理根对象。这个阶段的目的是为并发转移阶段做准备,以确保在该阶段的并发执行期间,应用程序的执行不会受到过多的停顿。
  5. 初始转移:ZGC会将剩余的存活对象从旧的内存区域转移到新的内存区域。
  6. 并发转移:ZGC会在后台并发地处理剩余的存活对象,并将它们从旧的内存区域转移到新的内存区域。与并发标记/对象重定位阶段一样,这个阶段的并发执行可以最大程度地减少应用程序的停顿时间

在ZGC的整个垃圾回收过程中,大部分工作都是与应用程序线程并发执行的,因此ZGC的主要特点是低延迟和高吞吐量,适合对响应时间有较高要求的应用场景

ZGC只有三个STW阶段:初始标记,再标记,初始转移。 其中,初始标记和初始转移分别都只需要扫描所有GC Roots,其处理时间和GC Roots的数量成正比,一般情况耗时非常短;再标记阶段STW时间很短,最多1ms,超过1ms则再次进入并发标记阶段。即,ZGC几乎所有暂停都只依赖于GC Roots集合大小,停顿时间不会随着堆的大小或者活跃对象的大小而增加

ZGC 日志分析

GC(4125) Heap before GC invocations=4125 (full 4125):
GC(4125)  ZHeap           used 1942M, capacity 4536M, max capacity 4536M
GC(4125)  Metaspace       used 146734K, committed 148096K, reserved 344064K
GC(4125)   class space    used 17468K, committed 18240K, reserved 212992K
GC(4125) Garbage Collection (Proactive)
GC(4125) Using 1 workers
GC(4125) Pause Mark Start 0.041ms
Safepoint "XMarkStart", Time since last: 22124432085 ns, Reaching safepoint: 17382 ns, Cleanup: 6329 ns, At safepoint: 76852 ns, Total: 100563 ns
GC(4125) Concurrent Mark 322.101ms
GC(4125) Pause Mark End 0.022ms
Safepoint "XMarkEnd", Time since last: 322171078 ns, Reaching safepoint: 9147 ns, Cleanup: 8722 ns, At safepoint: 52553 ns, Total: 70422 ns
GC(4125) Concurrent Mark Free 0.001ms
GC(4125) Concurrent Process Non-Strong References 41.260ms
GC(4125) Concurrent Reset Relocation Set 0.125ms
Safepoint "CleanClassLoaderDataMetaspaces", Time since last: 41168753 ns, Reaching safepoint: 76926 ns, Cleanup: 6011 ns, At safepoint: 3152494 ns, Total: 3235431 ns
GC(4125) Concurrent Select Relocation Set 5.057ms
GC(4125) Pause Relocate Start 0.019ms
Safepoint "XRelocateStart", Time since last: 2142288 ns, Reaching safepoint: 16014 ns, Cleanup: 4139 ns, At safepoint: 60372 ns, Total: 80525 ns
GC(4125) Concurrent Relocate 41.819ms
GC(4125) Heap after GC invocations=4126 (full 4126):
GC(4125)  ZHeap           used 242M, capacity 4536M, max capacity 4536M
GC(4125)  Metaspace       used 146734K, committed 148096K, reserved 344064K
GC(4125)   class space    used 17468K, committed 18240K, reserved 212992K
GC(4125) Load: 7.70/8.06/8.36
GC(4125) MMU: 2ms/85.9%, 5ms/94.4%, 10ms/97.2%, 20ms/98.6%, 50ms/99.4%, 100ms/99.7%
GC(4125) Mark: 1 stripe(s), 2 proactive flush(es), 1 terminate flush(es), 0 completion(s), 0 continuation(s) 
GC(4125) Mark Stack Usage: 32M
GC(4125) NMethods: 11693 registered, 10397 unregistered
GC(4125) Metaspace: 143M used, 144M committed, 336M reserved
GC(4125) Soft: 3566 encountered, 954 discovered, 0 enqueued
GC(4125) Weak: 21037 encountered, 7964 discovered, 6855 enqueued
GC(4125) Final: 45 encountered, 8 discovered, 0 enqueued
GC(4125) Phantom: 757 encountered, 499 discovered, 10 enqueued
GC(4125) Small Pages: 924 / 1848M, Empty: 8M, Relocated: 26M, In-Place: 0
GC(4125) Medium Pages: 2 / 64M, Empty: 32M, Relocated: 0M, In-Place: 0
GC(4125) Large Pages: 5 / 30M, Empty: 0M, Relocated: 0M, In-Place: 0
GC(4125) Forwarding Usage: 10M
GC(4125) Min Capacity: 4536M(100%)
GC(4125) Max Capacity: 4536M(100%)
GC(4125) Soft Max Capacity: 4536M(100%)
GC(4125)                Mark Start          Mark End        Relocate Start      Relocate End           High               Low         
GC(4125)  Capacity:     4536M (100%)       4536M (100%)       4536M (100%)       4536M (100%)       4536M (100%)       4536M (100%)   
GC(4125)      Free:     2594M (57%)        2564M (57%)        2600M (57%)        4294M (95%)        4294M (95%)        2560M (56%)    
GC(4125)      Used:     1942M (43%)        1972M (43%)        1936M (43%)         242M (5%)         1976M (44%)         242M (5%)     
GC(4125)      Live:         -               157M (3%)          157M (3%)          157M (3%)             -                  -          
GC(4125) Allocated:         -                30M (1%)           34M (1%)           38M (1%)             -                  -          
GC(4125)   Garbage:         -              1784M (39%)        1744M (38%)          45M (1%)             -                  -          
GC(4125) Reclaimed:         -                  -                40M (1%)         1738M (38%)            -                  -          
GC(4125) Garbage Collection (Proactive) 1942M(43%)->242M(5%)

关键点中文解释

  • GC(4125) HEAP BEFORE GC invocations=4125 (FULL 4125): 执行垃圾回收前的引用数
  • GC(4125) Garbage Collection (Proactive): 执行的是一次主动的垃圾回收。
  • GC(4125) USING 1 workers: 使用了1个工作线程。
  • GC(4125) CONCURRENT Mark 322.101ms: 并发标记阶段的耗时
  • GC(4125) CONCURRENT PROCESS Non-Strong REFERENCES 41.260ms: 并发处理非强引用的耗时
  • GC(4125) CONCURRENT RESET Relocation SET 0.125ms: 再标记阶段的耗时
  • GC(4125) CONCURRENT SELECT Relocation SET 5.057ms: 并发选择回收区域的耗时
  • GC(4125) CONCURRENT Relocate 41.819ms: 并发转移阶段的耗时
  • GC(4125) HEAP AFTER GC invocations=4126 (FULL 4126): 执行垃圾回收后的引用数

ZGC 垃圾收集统计

Last 10sLast 10mLast 10hTotal单位
Avg / MaxAvg / MaxAvg / MaxAvg / Max
Collector: Garbage Collection Cycle411.071 / 411.071426.927 / 571.956395.057 / 615.642396.554 / 794.838ms
Contention: Mark Segment Reset Contention0 / 00 / 00 / 00 / 0ops/s
Contention: Mark SeqNum Reset Contention0 / 00 / 00 / 00 / 0ops/s
Critical: Allocation Stall0 / 00 / 00 / 00 / 0ops/s
Critical: Allocation Stall0.000 / 0.0000.000 / 0.0000.000 / 0.0000.000 / 0.000ms
Critical: GC Locker Stall0 / 00 / 00 / 10 / 1ops/s
Critical: GC Locker Stall0.000 / 0.0000.000 / 0.0000.182 / 1.0800.135 / 1.156ms
Critical: Relocation Stall0 / 00 / 00 / 00 / 0ops/s
Critical: Relocation Stall0.000 / 0.0000.000 / 0.0000.000 / 0.0000.000 / 0.000ms
Memory: Allocation Rate83 / 14074 / 14851 / 21852 / 368MB/s
Memory: Defragment0 / 00 / 00 / 00 / 0ops/s
Memory: Out Of Memory0 / 00 / 00 / 00 / 0ops/s
Memory: Page Cache Flush0 / 00 / 00 / 00 / 0MB/s
Memory: Page Cache Hit L141 / 5937 / 6725 / 10926 / 184ops/s
Memory: Page Cache Hit L20 / 00 / 00 / 00 / 0ops/s
Memory: Page Cache Hit L30 / 00 / 00 / 00 / 63ops/s
Memory: Page Cache Miss0 / 00 / 00 / 00 / 1ops/s
Memory: Uncommit0 / 00 / 00 / 00 / 0MB/s
Memory: Undo Object Allocation Failed6 / 634 / 4471 / 6551 / 1196ops/s
Memory: Undo Object Allocation Succeeded21 / 2105 / 4822 / 6052 / 751ops/s
Memory: Undo Page Allocation0 / 30 / 30 / 50 / 7ops/s
Phase: Concurrent Mark322.101 / 322.101336.304 / 443.879317.178 / 518.134316.142 / 596.839ms
Phase: Concurrent Mark Continue0.000 / 0.0000.000 / 0.0000.000 / 0.0000.000 / 0.000ms
Phase: Concurrent Mark Free0.001 / 0.0010.001 / 0.0010.001 / 0.0310.001 / 0.031ms
Phase: Concurrent Process Non-Strong References41.260 / 41.26039.545 / 74.00236.013 / 74.00237.811 / 128.820ms
Phase: Concurrent Relocate41.819 / 41.81944.695 / 54.79935.851 / 61.68036.447 / 154.466ms
Phase: Concurrent Reset Relocation Set0.125 / 0.1250.130 / 0.1820.082 / 0.2870.096 / 0.539ms
Phase: Concurrent Select Relocation Set5.057 / 5.0575.580 / 6.7145.248 / 9.5775.375 / 96.450ms
Phase: Pause Mark End0.022 / 0.0220.027 / 0.0610.024 / 0.0770.024 / 0.103ms
Phase: Pause Mark Start0.041 / 0.0410.035 / 0.0490.036 / 0.2810.035 / 0.281ms
Phase: Pause Relocate Start0.019 / 0.0190.021 / 0.0300.020 / 0.0760.020 / 0.096ms
Subphase: Concurrent Classes Purge0.008 / 0.0080.031 / 0.2030.018 / 1.8350.072 / 67.248ms
Subphase: Concurrent Classes Unlink34.205 / 34.20532.226 / 65.28829.823 / 65.28831.479 / 89.630ms
Subphase: Concurrent Mark316.043 / 316.043330.668 / 437.551311.415 / 512.480310.233 / 588.118ms
Subphase: Concurrent Mark Try Flush0.120 / 0.2470.113 / 0.2490.114 / 3.1570.116 / 8.934ms
Subphase: Concurrent Mark Try Terminate0.028 / 0.0550.029 / 0.0760.031 / 0.4330.031 / 0.657ms
Subphase: Concurrent References Enqueue0.006 / 0.0060.006 / 0.0100.005 / 0.0450.006 / 0.064ms
Subphase: Concurrent References Process2.721 / 2.7212.955 / 4.3411.961 / 5.2112.033 / 37.505ms
Subphase: Concurrent Roots ClassLoaderDataGraph0.697 / 0.6970.626 / 0.7780.619 / 1.5920.635 / 1.764ms
Subphase: Concurrent Roots CodeCache0.000 / 0.0000.000 / 0.0000.000 / 0.0000.000 / 0.000ms
Subphase: Concurrent Roots JavaThreads5.053 / 5.0534.708 / 5.1804.889 / 91.0785.013 / 91.078ms
Subphase: Concurrent Roots OopStorageSet0.162 / 0.1620.138 / 0.1620.141 / 1.0290.144 / 1.029ms
Subphase: Concurrent Weak Roots OopStorageSet3.957 / 3.9573.962 / 4.5893.840 / 6.3333.849 / 8.860ms
Subphase: Pause Mark Try Complete0.000 / 0.0000.016 / 0.0160.011 / 0.0260.010 / 0.027ms
System: Java Threads87 / 8787 / 8987 / 9186 / 112thread

G1/ZGC 回收过程对比

G1垃圾回收周期

G1的混合回收过程可以分为标记阶段、清理阶段和复制阶段。

标记阶段停顿分析

  • 初始标记阶段:初始标记阶段是指从GC Roots出发标记全部直接子节点的过程,该阶段是STW的。由于GC Roots数量不多,通常该阶段耗时非常短。

  • 并发标记阶段:并发标记阶段是指从GC Roots开始对堆中对象进行可达性分析,找出存活对象。该阶段是并发的,即应用线程和GC线程可以同时活动。并发标记耗时相对长很多,但因为不是STW,所以我们不太关心该阶段耗时的长短。

  • 再标记阶段:重新标记那些在并发标记阶段发生变化的对象。该阶段是STW的。
    清理阶段停顿分析

  • 清理阶段:清点出有存活对象的分区和没有存活对象的分区,该阶段不会清理垃圾对象,也不会执行存活对象的复制。该阶段是STW的。

复制阶段停顿分析

  • 复制算法中的转移阶段需要分配新内存和复制对象的成员变量。转移阶段是STW的,其中内存分配通常耗时非常短,但对象成员变量的复制耗时有可能较长,这是因为复制耗时与存活对象数量与对象复杂度成正比。对象越复杂,复制耗时越长

四个STW过程中,初始标记因为只标记GC Roots,耗时较短。再标记因为对象数少,耗时也较短。清理阶段因为内存分区数量少,耗时也较短。转移阶段要处理所有存活的对象,耗时会较长。因此,G1停顿时间的瓶颈主要是标记-复制中的转移阶段STW

ZGC只有三个STW阶段:初始标记,再标记,初始转移。ZGC几乎所有暂停都只依赖于GC Roots集合大小,停顿时间不会随着堆的大小或者活跃对象的大小而增加

与ZGC对比,G1的转移阶段完全STW的,且停顿时间随存活对象的大小增加而增加


参考资料:

  1. 分代ZGC详解
  2. 新一代垃圾回收器ZGC的探索与实践
  3. 分代ZGC
  4. G1 垃圾收集器详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1254985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人力资源管理后台 === 首页+部署

目录 1.首页-echarts图表的应用 2.首页-echarts图表的按需导入 3.路由模式-将路由改成history模式 4. 打包分析-分析 5.CDN加速 6.项目打包-安装nginx 7.mac/windows环境下nginx部署启动项目 8.nginx解决history的404问题 9.nginx配置代理解决生产环境跨域问题 1.首页-…

复数的几何意义

1、复平面,复数的其它表示法 (1)几何表示法 直角平面坐标: 复平面 实轴,虚轴 (2)向量表示法 向量 模: 复数加减法可用向量的三角形法则或者平行四边形法则 (3)结论 (两边之和大于第三边) ((两边之差大于第三边)) *辐角&am…

「Verilog学习笔记」非整数倍数据位宽转换24to128

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 要实现24bit数据至128bit数据的位宽转换,必须要用寄存器将先到达的数据进行缓存。24bit数据至128bit数据,相当于5个输入数据第6个输入数据的拼接成一…

Educational Codeforces Round 158 [Rated for Div. 2]

A. Line Trip 还算比较简单的,不过本蒟蒻一开始以为是二分答案,二分写到一半突然想到油量直接取两个加油站之间的最大距离就好了。 最大距离能过,剩下必然都能过,要特判a[n]~x距离是两倍,因为x没有加油站&#xff0c…

【Python百宝箱】Python项目生态圈:虚拟环境全指南

项目管理达人:Python虚拟环境的智慧选择 前言 在Python开发领域,创建虚拟环境是一项至关重要的任务,它有助于项目之间的依赖隔离,确保每个项目都能独立运行且使用特定的库和工具。本文将介绍多种创建Python虚拟环境的方法&#…

C语言线性表的实现(详解)

数据结构之线性表 ​ 线性表的基本概念:线性表是由0个或者多个数据元素的有限序列 ​ 特性是: ​ 1:数据元素之间都是有顺序的 ​ 2:数据元素的个数是有限的, ​ 3:数据元素的类型是相同的 ​ 性质是&…

二进制编辑器hexedit的安装及使用

Hexedit 同时以 ASCII 和十六进制显示文件 安装 终端输入hexedit回车,如果没安装,会提示让输入 sudo apt-get install hexedit 照着输入命令,安装。安装完成后,cd到一个有二进制文件的目录下,输入hexedit命令回车 再…

激光雷达SLAM(一)------初始激光雷达SLAM

专栏目的及认识激光雷达SLAM 一、专栏目的二、初始激光雷达SLAM1、激光雷达SLAM算法相关知识点2、SLAM常见问题[^2]3、激光雷达SLAM的需求点4、RTK在SLAM中的作用5、激光雷达视觉紧耦合图优化滤波紧耦合 一、专栏目的 大家好!介绍一下博主自己,感知算法工…

在云服务器上搭建个人版chatGPT及后端Spring Boot集成chat GPT

原创/朱季谦 本文分成两部分,包括【国内服务器上搭建chat GPT】和【后端Spring Boot集成chat GPT】。 无论是在【国内服务器上搭建chat GPT】和【后端Spring Boot集成chat GPT】,两个方式都需要魔法访问,否则是无法正常使用的,即…

Java Flight Record 详解

核心概念 Java Flight Record 提供一个低开销的数据收集框架,用于对 Java 应用程序和 HotSpot JVM 进行故障排除。Flight Recorder 记录源自应用程序、JVM和操作系统的事件 Flight Record,顾名思义,相当于飞机黑匣子里保存的飞行记录 事件 …

vue3+ts mitt的使用

安装mitt :npm i mitt -Smain.ts: import mitt from mittconst Mit mitt();declare module vue {export interface ComponentCustomProperties{$Bus:typeof Mit} } app.config.globalProperties.$BusMit在A组件中使用 <template><div><h1>我是A<…

Leetcode—160.相交链表【简单】

2023每日刷题&#xff08;四十一&#xff09; Leetcode—160.相交链表 算法思想 两个链表的节点之和是相等的 如果两个链表相交&#xff0c;那么相交点之后的长度是相同的 我们需要做的事情是&#xff0c;让两个链表从同距离末尾同等距离的位置开始遍历。这个位置只能是较短…

【高可用架构】Haproxy 和 Keepalived 的区别

Haproxy 和 Keepalived 的区别 1.负载均衡器介绍2.Haproxy 和 Keepalived 的基本概念和特点2.1 Haproxy2.2 Keepalived 3.Haproxy 和 Keepalived 的区别3.1 功能上的区别3.2 架构上的区别3.3 配置上的区别 4.总结 1.负载均衡器介绍 负载均衡器是一种解决高并发和高可用的常用的…

【JavaSE】:数据类型

数据类型 一.总体概论二.java里与c的区别1.float2.char3.boolen 三.类型转换四.String类型 一.总体概论 在Java中数据类型主要分为两类&#xff1a;基本数据类型和引用数据类型。 不论是在16位系统还是32位系统&#xff0c;int都占用4个字节&#xff0c;long都占8个字节 。 整…

NAS非接入层协议学习(二)

在无线通信网络中 NAS (Non-Access Stratum)做为非接入层是演进分组系统(或5G核心网)中的一组协议。NAS用于在用户设备(UE)和移动管理实体(MME/AMF)之间传送非无线电信令&#xff0c;以实现NR/LTE/E-UTRAN接入。 NAS在协议栈中是控制面的最高层。 NAS协议分组中可以将其分为两…

3款免费的语音视频转文本AI神器

最近有很多粉丝让我出一期关于语音转文本的免费AI神器&#xff0c;毕竟这类工具在学习和工作中经常会用到&#xff0c;那今天就给大家安排。 我亲测了好几款软件之后&#xff0c;最终评选留下了三款 剪映hugging face飞书妙记 接下来一一给大家讲解 1.剪映 剪映其实是一款视…

因式分解的几何意义

本来准备和女儿一起玩一道几何题&#xff0c;想想还是算了&#xff0c;不如讲点更有趣的。 任何因式分解都是在堆积木&#xff0c;不信你看&#xff1a; 二项式定理&#xff0c;洋灰三角&#xff0c;都是面积&#xff0c;体积&#xff0c;超维体积的拼接&#xff0c;一个大超…

Python | CAP - 累积精度曲线分析案例

CAP通常被称为“累积精度曲线”&#xff0c;用于分类模型的性能评估。它有助于我们理解和总结分类模型的鲁棒性。为了直观地显示这一点&#xff0c;我们在图中绘制了三条不同的曲线&#xff1a; 一个随机的曲线&#xff08;random&#xff09;通过使用随机森林分类器获得的曲线…

leetcode_828_统计子串中的唯一字符

题意&#xff1a;所有子串中单个字符出现的次数和 问题转化&#xff1a;对于串中的每个字符&#xff0c;只包含其一次的所有子串的个数和 关于求只包含某位置字符一次的子串个数 class Solution { public:int uniqueLetterString(string s) {/* ...A...A...A...*/int n s.size…

【C++】类型转换 ② ( C++ 静态类型转换 static_cast | C 语言隐式转换弊端 | 代码示例 )

文章目录 一、静态类型转换 static_cast1、C 静态类型转换 static_cast2、C 语言隐式转换弊端3、代码示例 在之前写过一篇 C 类型转换的博客 【C 语言】类型转换 ( 转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast | 字符串转换 ) , 简单介绍了 C 类…