当前位置: 首页 > news >正文

JVM垃圾回收器-ZGC

一、概述

ZGC(Z Garbage Collector)是一种高效且可扩展的低延迟垃圾回收器。在垃圾回收过程中,ZGC通过优化算法和硬件支持,将Stop-The-World(STW)时间控制在一毫秒以内,使其成为追求低延迟应用的理想选择。此外,ZGC支持灵活的堆大小配置,从几百兆到16TB的堆大小均可轻松应对,且堆大小对STW时间的影响微乎其微。

二、G1机制

G1的STW时间具体包括以下几个步骤:

  • 初始标记(Initial Mark):STW阶段,采用三色标记法快速标记从GC Root直接可达的对象。此阶段的STW时间通常非常短暂。
  • 并发标记(Concurrent Mark):并发执行阶段,对存活对象进行标记。这个阶段允许用户线程和GC线程同时工作,从而减少了STW时间。
  • 最终标记(Final Mark):STW阶段,处理SATB(Snapshot-At-The-Beginning)相关的对象标记。此阶段的STW时间同样较短。
  • 清理(Cleanup):STW阶段,如果某个区域中没有存活对象,则直接清理该区域。此阶段的STW时间也较短。
  • 转移(Copy):将存活对象复制到其他区域。STW时间较长的阶段,因为它涉及对象的复制和引用更新。

三、G1缺点

G1转移时需要停顿,STW时间较长。因为如果不STW,会出现数据不一致。

举例:假设对象A引用了对象C,在转移过程中,C对象被复制到新的区域。如果此时用户线程修改了A对象的某个属性,但实际上这个修改是针对转移前的C对象。当转移完成后,A对象的引用被更新为指向新的C对象,但此时获取属性仍是原来的旧值,因为修改是在转移前进行的。这种不一致性会导致数据错误。

为了解决这个问题,G1垃圾回收器在转移过程中需要暂停用户线程,确保转移操作的原子性和正确性。然而,ZGC和Shenandoah等新型垃圾回收器解决了这一问题,使得转移过程也能够并发执行,从而进一步提高了性能。

四、ZGC核心技术

1.读屏障(Load Barrier)

在ZGC中,采用了读屏障(Load Barrier)技术来处理对象引用的获取。当尝试获取一个对象引用时,读屏障会检查该引用是否指向了转移后的对象。如果不是,用户线程会将引用更新为指向转移后的对象。这样就可以直接修改转移后的对象的属性。

2.着色指针(Colored Pointers)

着色指针的设计将原本8字节的地址指针巧妙地拆分成了三个部分:

  • 低44位地址:用于直接表示对象的内存地址,这个范围足够覆盖大多数应用程序所使用的内存空间,最多可以表示16TB的内存。
  • 中间4位颜色位:这四位用于存储关于对象状态的信息。每一位只能存储0或1,并且同一时间只有一位可以是1。不同的位代表不同的状态
  • 高16位未使用:这些位在当前实现中未被使用,但为未来扩展提供了空间
    在这里插入图片描述

终结位:当设置时,表示该对象只能通过终结器(Finalizer)进行访问。

重映射位(Remap):表示在垃圾收集转移过程后,对象的引用关系已经更新。

Marked0和Marked1:用于标记对象是否可达,是垃圾收集过程中的重要标识。

五、ZGC的内存划分

与G1不同的是,ZGC对Zpage的划分更加精细,旨在实现更精确的内存管理和控制,从而进一步减少垃圾回收过程中的停顿时间。ZGC的Zpage可以分为三类,分别是小区域、中区域和大区域,它们各自具有不同的容量和用途:

  • 小区域(Small Zpage):每个小区域的大小为2MB,专门用于存放小型对象,即大小不超过256KB的对象。这种划分方式有助于减少内存碎片,并提高内存利用率。
  • 中区域(Medium Zpage):每个中区域的大小为32MB,用于存放中等大小的对象,即大小在256KB到4MB之间的对象。中区域的引入进一步扩展了ZGC的适用范围,使其能够处理更大规模的内存需求。
  • 大区域(Large Zpage):大区域的大小则根据实际需求动态分配,每个大区域只保存一个大于4MB的大型对象。这种设计允许ZGC在必要时为大型对象提供足够的连续内存空间。
http://www.lqws.cn/news/161641.html

相关文章:

  • GC1809:高性能音频接收与转换芯片
  • NineData云原生智能数据管理平台新功能发布|2025年5月版
  • SpringCloud——Nacos
  • SDC命令详解:使用set_fanout_load命令进行约束
  • 可穿戴设备:健康监测的未来之眼
  • clickhouse常用语句汇总——持续更新中
  • 牛客小白月赛113
  • Git的由来与应用详解:从Linux内核到现代开发的革命性工具
  • windows server2019 不成功的部署docker经历
  • [特殊字符] 一文了解目前主流的 Cursor AI 免费续杯工具!
  • AI时代的弯道超车之第二十四章:AI伦理和版权问题
  • 智慧园区数字孪生全链交付方案:降本增效30%,多案例实践驱动全周期交付
  • STM32入门教程——OLED调试工具
  • Elasticsearch最新入门教程
  • vue3 eslint ts 关闭多单词命名检查
  • AirSim/Cosys-AirSim 游戏开发(二)使用自定义场景
  • 大模型学习
  • adb 连不上真机设备问题汇总
  • uniapp微信小程序视频实时流+pc端预览方案
  • 音视频之视频压缩编码的基本原理
  • Rust Floem UI 框架使用简介
  • 从《现实不似你所见》探寻与缘起性空的思想交织
  • OPenCV CUDA模块目标检测----- HOG 特征提取和目标检测类cv::cuda::HOG
  • 基于STM32设计的水资源监测系统
  • 前缀和题目:逐步求和得到正数的最小值
  • PySpark性能调优手册:大数据处理中的避坑与实践
  • 最小硬件系统概念及其组成
  • 数据质量是什么意思?怎样做好数据质量监控?
  • ROS2 节点类中要避免While true 循环
  • Spring AI(11)——SSE传输的MCP服务端