(9)《G1》

2026-03-21
2
-
- 分钟
|
  • 概述:G1(Garbage-First)是Java专为超大堆内存设计的垃圾回收器,与CMS、SerialGC、ParallelGC并列。核心目标:低延迟(<200ms停顿)+ 高吞吐量,适用于大内存(>4GB)场景。

适用场景

  • 低延迟要求(如实时系统)
  • 超大堆内存(>4GB,避免Full GC)
  • 需平衡吞吐量与停顿时间

核心机制

  • 堆内存划分:固定大小Region(1MB~32MB),逻辑分为新生代、老年代、Humongous(巨型对象)。
  • 算法组合
    • Region间:复制算法(新生代回收)
    • Region内:标记-整理(老年代回收,避免碎片)

垃圾回收阶段(关键流程)

  1. 初始标记(Initial Mark):STW(暂停应用),标记GC Roots直接可达对象(极短,<10ms)。
  2. 并发标记(Concurrent Mark):并发执行(应用线程不停),遍历全堆标记可达对象(基于Remembered Set优化)。
  3. 最终标记(Remark/G1remark):STW,处理并发标记期间的引用变化(如跨代引用更新)。
  4. 混合回收(Mixed GC)
    • 触发条件:老年代空间不足(非Full GC)
    • 过程
      • 选择回收价值高的老年代Region(基于垃圾比例)
      • 新生代:复制算法(Eden→Survivor,拷贝存活对象)
      • 老年代:标记-整理(移动存活对象,压缩内存)
    • 优势:并发执行,停顿时间可控(<200ms)。

关键特性

  • 新生代回收:Eden区划分为多个小区(Region),复制算法(STW极短)。
  • 跨代引用:通过Remembered Set(RS) 跟踪新生代→老年代引用,避免全堆扫描。
  • 巨型对象(Humongous):>Region半大小的对象,直接分配连续Region,避免碎片。
  • 字符串去重-XX:+UseStringDeduplication(JDK 8u20+),减少重复字符串内存占用。
  • 类卸载:GC期间自动卸载无用类(与G1兼容,无需额外配置)。
  • 动态调整阈值
    • G1MixedGCCountTarget:动态控制混合回收的Region数量
    • G1HeapWastePercent:动态调整堆垃圾比例阈值(默认5%)
  • 老年代回收:内存不足时并发触发混合回收,避免Full GC(STW长停顿)。

:G1通过Region划分和动态阈值,实现“优先回收垃圾最多区域”(Garbage-First),平衡延迟与吞吐。

评论交流

文章目录