G1垃圾收集器学习笔记

2025-09-23

一、G1垃圾收集器概述

G1(Garbage-First)是Java 9默认的垃圾收集器,核心特性如下:

  • 取消物理分代:将内存划分为2048个逻辑Region(默认值)
  • 动态分区管理:年轻代/老年代区域可相互转化
  • 巨型对象处理:新增Humongous区存储超Region 50%的大对象

二、内存管理机制

1. 内存分区

  • 逻辑分区:保留年轻代(Eden/Survivor)、老年代概念
  • 物理结构
    • 默认2048个Region(通过-XX:G1HeapRegionSize调整)
    • 年轻代初始占比5%(动态调整,上限60%)
    • Eden:Survivor默认比例8:1:1

2. 特殊区域

  • Humongous区
    • 存储超过Region 50%的大对象
    • 若对象超过单个Region大小,会被分割存储于多个连续Region

三、垃圾回收流程

G1回收分为四个阶段:

  1. 初始标记(Stop The World)
    • 标记GC Roots直接引用对象
  2. 并发标记(Concurrent)
    • 与工作线程并行标记存活对象
  3. 最终标记(Stop The World)
    • 修正并发阶段的增量引用
  4. 筛选回收(Concurrent)
    • 按回收价值排序Region
    • 执行复制算法整理内存

四、核心特性

  1. 并行与并发
    • 多核CPU缩短停顿时间
  2. 分代抽象管理
    • 逻辑分代替代物理分区
  3. 空间整合
    • 整体标记整理 + 局部复制算法
    • 减少内存碎片

五、垃圾收集分类

1. YoungGC(年轻代回收)

  • 触发条件
    • 伊甸区填满时预估回收时间:
      • 若预估时间 < MaxGCPauseMillis → 新增年轻代Region
      • 若预估时间 ≈ MaxGCPauseMillis → 触发回收
  • 执行逻辑
    • 回收所有年轻代Region
    • 存活对象晋升至老年代/Survivor区

2. MixedGC(混合回收)

  • 触发条件
    • 老年代占用率超过阈值(-XX:InitiatingHeapOccupancyPercent
  • 执行逻辑
    • 回收所有年轻代 + 部分老年代Region(非全部老年代)
    • 具体回收数量由回收价值决定

3. Full GC(负GC)

  • 触发条件
    • 内存不足(如MixedGC无法完成回收)
  • 执行逻辑
    • 单线程标记-清理-压缩内存
    • 现代JVM(Java 11+)通过-XX:+UseG1GC -XX:-UseAdaptiveSizePolicy可减少Full GC

六、关键参数

参数 说明
-XX:MaxGCPauseMillis 目标最大停顿时间(默认200ms)
-XX:G1HeapRegionSize Region大小(推荐1MB-32MB)
-XX:InitiatingHeapOccupancyPercent 老年代触发并发回收阈值(默认45%)

七、注意事项

  • 过度追求低停顿可能导致:
    • 垃圾堆积 → 负GC → 回收成本上升
  • 生产环境建议保持默认参数配置
  • 通过-XX:+PrintGCDetails -XX:+PrintGCDateStamps监控GC行为

八、其他相关回收器

  • ZGC(JDK 11引入的低延迟垃圾收集器):
    • 支持TB级内存
    • 停顿时间<10ms
    • 基于Region的着色指针技术

参考资料