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

G1,最大的特点是什么,标记位图,卡表卡页,SATB又分别是什么?

G1 垃圾收集器的核心特点与关键技术解析


一、G1(Garbage-First)的最大特点

G1 是 JDK 9 及之后版本的默认垃圾收集器,其核心设计目标是 高吞吐量可预测的低停顿时间(STW)。最大特点总结为以下四点:

  1. Region 化内存布局

    • 将堆划分为多个大小相等的 Region(默认 2048 个,每个 Region 大小为 1MB~32MB),每个 Region 可以是 Eden、Survivor、Old 或 Humongous(大对象)类型。
    • 物理不分代,逻辑分代:通过动态分配 Region 类型实现分代逻辑,避免传统分代收集器的内存碎片问题。
  2. 可预测的停顿模型

    • 通过 停顿时间目标-XX:MaxGCPauseMillis,默认 200ms)控制垃圾回收时间。
    • 每次回收优先选择 垃圾比例最高(Garbage-First)的 Region 进行回收,确保在有限时间内回收最多垃圾。
  3. 并发与并行结合的回收机制

    • 并发标记:与应用程序线程并发执行,标记存活对象。
    • 并行回收:多线程并行清理垃圾 Region。
  4. 混合回收模式

    • 结合 Young GC 和 Mixed GC:
      • Young GC:回收 Eden 和 Survivor Region。
      • Mixed GC:在 Young GC 后,选择性回收 Old Region(基于设定的停顿时间)。

二、关键技术细节
1. 标记位图(Mark Bitmap)
  • 作用:在并发标记阶段记录对象的存活状态。
  • 实现原理
    • 每个 Region 对应一个 位图(Bitmap),每个位(bit)代表 Region 内一个对象的存活状态(1 为存活,0 为可回收)。
    • 通过位图快速定位存活对象,避免全堆扫描。
  • 优势:内存占用小(位图压缩存储),支持快速标记与清理。
2. 卡表(Card Table)与卡页(Card Page)
  • 卡表的作用记录跨代引用,优化垃圾回收的扫描范围。
    • 传统分代 GC 中,老年代对象可能引用新生代对象(跨代引用)。为避免全堆扫描,卡表标记这些引用所在的区域。
  • 卡页(Card Page)
    • 堆内存按固定大小(如 512B)划分为卡页,卡表中每个条目(卡页)记录对应内存块是否被修改。
    • 当老年代对象写入新生代对象的引用时,写屏障(Write Barrier) 会标记对应卡页为脏(Dirty)。
  • G1 中的卡表优化
    • G1 通过卡表快速定位跨 Region 引用,减少扫描范围。
    • 在 Mixed GC 阶段,仅需扫描被标记为脏的卡页,提升效率。
3. SATB(Snapshot-At-The-Beginning)
  • 问题背景:在并发标记阶段,应用程序可能修改对象引用关系,导致标记结果不准确(例如:已标记的对象变为垃圾)。
  • SATB 的核心思想
    • 在并发标记开始时,对堆中存活对象建立一个 逻辑快照
    • 即使对象在标记过程中变为垃圾,仍被视为存活,确保本轮标记的正确性。
  • 实现机制
    • 写屏障 + SATB 队列:当对象引用被修改时(如 a.x = b),原始引用(a.x 的旧值)会被记录到 SATB 队列。
    • 并发标记结束后,需处理 SATB 队列中的残留引用,避免漏标。
  • 优点:避免漏标(对象被错误回收),但可能产生 浮动垃圾(需在下一次 GC 回收)。

三、G1 与其他收集器的对比
特性G1CMSZGC
内存布局Region 化堆传统分代Region 化堆(动态大小)
停顿时间控制可预测(软实时)不可预测极低停顿(10ms 以下)
并发标记支持(SATB 算法)支持(增量更新算法)支持(染色指针)
内存碎片处理通过 Region 复制消除碎片需 Full GC 压缩无碎片(指针动态重映射)
适用场景大堆内存、低延迟需求中小堆、低延迟超大堆(TB 级)、超低延迟

四、G1 调优关键参数
  1. 基础配置

    • -XX:+UseG1GC:启用 G1。
    • -XX:MaxGCPauseMillis=200:设定最大停顿时间目标。
    • -XX:G1HeapRegionSize=32M:设置 Region 大小(需为 2 的幂)。
  2. 并发标记优化

    • -XX:InitiatingHeapOccupancyPercent=45:触发并发标记的老年代占用阈值。
    • -XX:G1ReservePercent=10:预留空闲 Region 比例,避免晋升失败。
  3. 混合回收控制

    • -XX:G1MixedGCLiveThresholdPercent=85:仅回收存活对象低于 85% 的 Old Region。
    • -XX:G1MixedGCCountTarget=8:混合 GC 最多执行次数。

在这里插入图片描述


http://www.kler.cn/a/576348.html

相关文章:

  • 统一数据返回格式
  • 【NetTopologySuite类库】geojson和shp互转,和自定义对象互转
  • Kotlin字符串操作在Android开发中的应用示例
  • Java网络爬虫工程
  • 深度学习(斋藤)学习笔记(五)-反向传播2
  • 【卫星语音通信】神经网络语音编解码算法:AudioDec
  • 常见Web应用源码泄露问题
  • 揭开Android View的神秘面纱:深入探索工作原理
  • Go语言集成DeepSeek API和GoFly框架文本编辑器实现流式输出和对话(GoFly快速开发框架)
  • vue的el-form-item循环检验rules
  • AWS DynamoDB深度解析:高并发场景下的NoSQL数据库设计与优化实践
  • 重学 Android 自定义 View 系列(十一):文字跑马灯剖析
  • GStreamer —— 2.2、Windows下Qt加载GStreamer库后运行 - “教程2:GStreamer 概念“(附:完整源码)
  • Swift系列02-Swift 数据类型系统与内存模型
  • 智慧风电赋能绿色能源的新篇章
  • IDEA Generate POJOs.groovy 踩坑小计 | 生成实体 |groovy报错
  • WPF在特定领域的应用:打造一款专业的图像编辑工具
  • Maven 使用指南:基础 + 进阶 + 高级用法
  • 【JavaWeb】Web基础概念
  • 嵌入式中Type-C 与快充相关知识详解