当前位置: 首页 > 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.dtcms.com/a/275024.html

相关文章:

  • 【TCP/IP】16. 简单网络管理协议
  • 天晟科技携手万表平台,共同推动RWA项目发展
  • 从「小公司人事」到「HRBP」:选对工具,比转岗更能解决成长焦虑
  • Java大厂面试故事:谢飞机的互联网音视频场景技术面试全纪录(Spring Boot、MyBatis、Kafka、Redis、AI等)
  • kubernetes单机部署踩坑笔记
  • DIDCTF-蓝帽杯
  • 谷歌云代理商:谷歌云TPU/GPU如何加速您的AI模型训练和推理
  • 【数据结构与算法】206.反转链表(LeetCode)
  • C++:非类型模板参数,模板特化以及模板的分离编译
  • 实现将文本数据(input_text)转换为input_embeddings的操作
  • 《从依赖纠缠到接口协作:ASP.NET Core注入式开发指南》
  • Vue 表单开发优化实践:如何优雅地合并 `data()` 与 `resetForm()` 中的重复对象
  • Sigma-Aldrich 细胞培养实验方案 | 通过Hoechst DNA染色检测细胞的支原体污染
  • 拔高原理篇
  • 奇哥面试记:SpringBoot整合RabbitMQ与高级特性,一不小心吊打面试官
  • java底层的native和沙箱安全机制
  • Lecture #19 : Multi-Version Concurrency Control
  • 深入理解JVM的垃圾收集(GC)机制
  • Next知识框架、SSR、SSG和ISR知识框架梳理
  • c++——运算符的重载
  • 鸿蒙开发之ArkTS常量与变量的命名规则
  • 面向对象编程
  • [面试] 手写题-选择排序
  • 持有对象-泛型和类型安全的容器
  • 深度学习中的归一化技术详解:BN、LN、IN、GN
  • Kubernetes 高级调度特性
  • C语言:位运算
  • Redis 哨兵机制
  • 多代理系统(multi-agent)框架深度解析:架构、特性与未来
  • 无代码自动化测试工具