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

G1 垃圾回收算法详解

目录

  1. 简介

  2. G1 GC 的设计目标

  3. 内存结构

  4. 回收过程

    • 初始标记(Initial Mark)
    • 并发标记(Concurrent Mark)
    • 最终标记(Final Mark / Remark)
    • 筛选回收(Cleanup / Evacuation)
  5. 混合回收(Mixed GC)

  6. 与其他 GC 的比较

  7. 优缺点

  8. 调优建议

  9. 总结


简介

G1(Garbage-First)是一种服务于 多核、大内存、低延迟 应用场景的 服务器端垃圾收集器,自 JDK 9 起成为默认 GC。其主要目标是以可预测的停顿时间来实现高吞吐量。


G1 GC 的设计目标

  • 可预测的 GC 停顿时间(如 <200ms
  • 减少 Full GC 的频率
  • 高吞吐量与低延迟的平衡
  • 并行与并发执行,提高 CPU 利用率

内存结构

G1 GC 将堆划分为多个等大小的 Region(区域),每个 Region 大小为 1MB 到 32MB(默认 4MB),总数不超过 2048。

  • 年轻代(Young Generation):包含 Eden 和 Survivor 区域,分布在多个 Region 中
  • 老年代(Old Generation):由存活对象多次晋升后形成
  • Humongous Region:用于存放大对象(大于一个 Region 的一半)
+------------------------------------------------------+
|                      Java Heap                       |
| +-----------+  +-----------+  +-----------+          |
| |  Eden     |  | Survivor  |  |  Old Gen  |   ...     |
| |  Region   |  |  Region   |  |  Region   |           |
| +-----------+  +-----------+  +-----------+           |
+------------------------------------------------------+

回收过程

G1 的 GC 过程主要分为以下阶段:

初始标记(Initial Mark)

  • 标记从 GC Roots 可达的对象
  • 只处理 Eden 区中的新对象引用
  • 与 Minor GC 一起发生(STW)

并发标记(Concurrent Mark)

  • 并发执行,不会暂停应用线程
  • 遍历整个堆中的对象图,识别存活对象
  • 构建每个 Region 的存活率统计信息

最终标记(Final Mark / Remark)

  • STW 阶段
  • 补充并发标记过程中遗漏的变更
  • 采用 SATB(Snapshot-At-The-Beginning)写屏障

筛选回收(Cleanup / Evacuation)

  • 选出回收价值高的 Region 进行回收(依据回收成本与收益)
  • 将存活对象移动(Evacuation)到其他 Region
  • 回收原 Region,形成空 Region

混合回收(Mixed GC)

在 Full GC 之前,G1 会执行 Mixed GC

  • 回收部分 Old Region + 所有 Young Region
  • 并非一次完成,分多次 Mixed GC 执行,降低单次停顿时间
  • 策略性选择回收的 Old Region

与其他 GC 的比较

特性CMSG1 GCZGC/ Shenandoah
并发标记
并发清理有(只处理部分 Region)
Region 化否(分代)是(统一 Region)
停顿时间不可预测可预测极低停顿
吞吐量
优化目标响应性响应性 + 吞吐量极低延迟

优缺点

优点

  • 可预测的 GC 停顿时间
  • 更高的并发度与吞吐量
  • 减少 Full GC 发生频率
  • 自动调整回收策略

缺点

  • 配置复杂度略高
  • 对大对象的处理仍不理想(Humongous Objects)
  • 初期占用 CPU 多,可能影响响应性

调优建议

  • 设置最大停顿时间目标:

    -XX:MaxGCPauseMillis=200
    
  • 启用 G1 GC:

    -XX:+UseG1GC
    
  • 控制堆内存大小:

    -Xms4g -Xmx4g
    
  • 限制 Humongous 对象产生,使用对象池

  • 监控指标:

    • gc.pause
    • gc.alloc.rate
    • gc.live.data.size
    • gc.heap.size

总结

G1 GC 是一款结合了 吞吐量、低延迟、可预测停顿 特性的现代垃圾回收器,非常适合服务端、大型 Java 应用。它通过 Region 化设计、分阶段回收与混合策略,达成了响应性和高效性的平衡。

在对 GC 行为有更高可控需求的场景下,G1 是比 CMS 更优秀的选择。

http://www.lryc.cn/news/585057.html

相关文章:

  • 类之间的纵向关系——继承
  • rom定制系列------红米note10 5G版camellia原生安卓14批量线刷 miui安卓11修改型号root版
  • bash中||与的区别
  • consul 的安装与服务发现
  • Python PDFplumber详解:从入门到精通的PDF处理指南
  • Java 深入解析:JVM对象创建与内存机制全景图
  • mysql中的自增ID
  • k8s-高级调度(一)
  • cefSharp.WinForms.NETCore 138.xx (cef138/Chromium 138.0.7204.97) 升级测试体验
  • 《从依赖纠缠到接口协作:ASP.NET Core注入式开发指南》
  • tcp/quic 的滑动窗口
  • 基于ASP.NET+SQL Server实现(Web)企业进销存管理系统
  • 虹科分享 | 告别实体钥匙!数字钥匙正在重构你的用车体验
  • 大模型及agent开发6 OpenAI Assistant API 高阶应用 - 流式输出功能
  • 【Kubernetes】Ubuntu 24.04 安装 K3s v1.33.2+k3s
  • 上半年净利预增66%-97%,高增长的赛力斯该咋看?
  • windows配置python环境
  • 【面板数据】省级泰尔指数及城乡收入差距测算(1990-2024年)
  • MySQL 的语言体系
  • Tomasulo算法是什么?
  • PCB 层压板各向异性:对高级过孔建模的影响
  • AMTS AHTE | 具身智能成制造升级新引擎 灵途科技助力更强感知
  • 1965–2022年中国大陆高分辨率分部门用水数据集,包含:灌溉用水、工业制造用水、生活用水和火电冷却
  • MDSE模型驱动的软件工程和敏捷开发相结合的案例
  • 淘宝拍立淘接口技术解析:从原理到实践‌
  • 1.1.2 运算符与表达式——AI教你学Django
  • [WinForms] 如何为 .NET Framework 4.8 窗体程序添加自定义图标
  • 多租户架构下的多线程处理实践指南
  • 【网络】Linux 内核优化实战 - net.netfilter.nf_conntrack_max
  • 【网络】Linux 内核优化实战 - net.netfilter.nf_conntrack_buckets