ZGC 垃圾回收过程

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.mzph.cn/news/171749.shtml

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

相关文章

基于STC12C5A60S2系列1T 8051单片按页写IIC总线器件24C02并显示在液晶显示器LCD1602上应用

基于STC12C5A60S2系列1T 8051单片机按页写IIC总线器件24C02并显示在液晶显示器LCD1602上应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显示器LCD1602简单介绍…

【brpc学习实践十】streaming log实战

实战实例 通常我们在服务还没正式起来时,会用brpc流式log打印,支持对日志输出到ostream对象中(默认std)。同时会在服务初始化时配置LogSink,实现自己的log,这样后续都可以将输出重定向至自己的log. int init(int arg…

Linux MMC子系统 - 6.eMMC 5.1工作模式-设备识别模式

By: Ailson Jack Date: 2023.11.26 个人博客:http://www.only2fire.com/ 本文在我博客的地址是:http://www.only2fire.com/archives/165.html,排版更好,便于学习,也可以去我博客逛逛,兴许有你想要的内容呢。…

RocketMQ 安装部署及应用场景记录

文章目录 前言一、RocketMQ简介1.1 整体架构 二、RocketMQ安装部署2.1 RocketMQ 下载2.2 修改 JVM 参数2.3 启动 NameServer 和 Broker2.4 验证发送和接受消息2.5 停止 NameServer 和 Broker2.6 配置全局环境 三、RocketMQ应用场景3.1 异步处理3.2 应用解耦3.3 流量削峰 前言 …

7.前端--CSS-字体属性【2023.11.26】

CSS字体属性 CSS Fonts (字体)属性用于定义字体样式、粗细、大小、和字形。 1.文字样式 CSS 使用 font-style 属性设置文本的风格。 语法: p { font-style: normal; }属性: 2字体粗细 CSS 使用 font-weight 属性设置文本字体的粗细。 语法&#xff1a…

已知两个链表L1和L2分别表示两个集合,其中元素递增排列。请设计一个算法,用于求出L1与L2的交集,并存放在L1链表中

已知两个链表L1和L2分别表示两个集合,其中元素递增排列。请设计一个算法,用于求出L1与L2的交集,并存放在L1链表中。 代码思路: 我们创建一个辅助链表L3,用于存储L1和L2链表的交集,用s遍历L3各个元素 用p和…

Java | The last packet sent successfully to the server was xxx milliseconds ago

最近在部署代码后,后端总是会遇到这个问题,设备通道在访问数据库时经常会报错,在搜集大量资料后我以为是配置问题,首先要保证: (1)首先确定jdbc.url地址是正确的 (2&#xf…

2024年天津天狮学院专升本食品质量与安全专业《分析化学》考纲

2024年天津天狮学院食品质量与安全专业高职升本入学考试《分析化学》考试大纲 一、考试性质 《分析化学》专业课程考试是天津天狮学院食品质量与安全专业高职升本入学考试 的必考科目之一,其性质是考核学生是否达到了升入本科继续学习的要求而进行的选拔性考试。《…

2023年09月 Scratch(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 运行下面程序后,角色的x坐标值是?( ) A:100 B:90 C:110 D:120 答案:C 利用变量值作为条件,控制循环的次数。变量从0~10的过程中每次角色的x坐标都增加了10,当变量值为1…

Unity-链接MySql8.0

链接MySql8.0 1.准备dll 一、找到l18N相关的dll 这里给出一个参考地址 D:\Unity\2020.3.48f1c1\Editor\Data\MonoBleedingEdge\lib\mono\unityjit在里面找到如下图的四个dll 二、下载数据库链接dll https://downloads.mysql.com/archives/c-net/在这里搜索历史版本(Archiv…

flask依据现有的库表快速生成flask实体类

flask依据现有的库表快速生成flask实体类 在实际开发过程中,flask的sqlalchemy对应的model类写起来重复性较强,如果表比较多会比较繁琐,这个时候可以使用 flask-sqlacodegen 来快速的生成model程序或者py文件,以下是简单的示例&a…

Echart力引导依赖关系布局图

Echarts ECharts(Enterprise Charts)Apache ECharts是百度开发的一款开源的 JavaScript 数据可视化库。它提供了丰富的图表和图形,适用于在 Web 应用程序中创建各种交互式和动态的数据可视化图表。ECharts支持各种图表类型,包括折…

一. BEV感知算法介绍

目录 前言1. BEV感知算法的概念2. BEV感知算法数据形式3. BEV开源数据集介绍3.1 KITTI数据集3.2 nuScenes数据集 4. BEV感知方法分类4.1 纯点云方案4.2 纯视觉方案4.3 多模态方案 5. BEV感知算法的优劣6. BEV感知算法的应用介绍7. 课程框架介绍与配置总结下载链接参考 前言 自动…

Java中wait()方法在synchronized方法中调用的奥秘

作为一名Java程序员,我们深知synchronized关键字和wait()方法在多线程编程中的重要性。 在本文中,我们将探讨为什么wait()方法需要在synchronized方法中调用,以及它们是如何协同工作的。 首先,让我们了解一下synchronized关键字和…

线程的认识,本质,和进程的区别,哪些结构是共享/独立的,切换成本,不同os下的线程

目录 再次认识进程 用户视角 内核视角 引入线程 概念 调度的基本单位 模拟出图像 思考 线程的本质 线程和进程的区别 线程哪些结构是共享的 引入 地址空间 系统资源 ​编辑 线程哪些结构是单独拥有 引入 地址空间 系统资源 线程间切换的成本更低 linu…

代码随想录算法训练营第五十九天|503. 下一个更大元素 II、42. 接雨水

第十章 单调栈part02 503. 下一个更大元素 II 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之…

进阶JAVA篇- Java 综合基本语法实践(习题一)

路漫漫其修远兮,吾将上下而求索。—— 屈原 目录 第一道题:集合的灵活运用 第二道题:基础编程能力 第三道题: 手写 ArrayList 集合(模拟实现 ArrayList 核心API) 第四道题:二分查找的应用 第五道…

RandomAccessFile学习笔记

文章目录 RandomAccessFile学习笔记前言1、RandomAccessFile基本介绍1.1 RandomAccessFile相关基本概念1.2 RandomAccessFile家族体系 2、RandomAccessFile基本使用2.1 RandomAccessFile常用API介绍2.2 RandomAccessFile常用API演示2.3 RandomAccessFile实现断点续传 1、Random…

C语言--三目运算符

一.介绍⭐ <表达式1>&#xff1f;<表达式2>&#xff1a;<表达式3> 它的含义是&#xff1a;如果表达式1的值为真&#xff08;非零&#xff09;&#xff0c;则整个表达式的值为表达式2的值&#xff1b;否则&#xff0c;整个表达式的值为表达式3的值。 三目运算…

Python——常见内置模块

Python 模块&#xff08;Modules&#xff09;1、概念模块函数类变量2、分类3、模块导入的方法&#xff1a;五种4、使用import 导入模块5、使用from……import部分导入6、使用as关键字为导入模块或功能命名别名7、模块的搜索目录8、自定义模块 常见内置模块一、math模块二、rand…