G1 垃圾收集器学习笔记
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
- 默认2048个Region(通过
2. 特殊区域
- Humongous区:
- 存储超过Region 50%的大对象
- 若对象超过单个Region大小,会被分割存储于多个连续Region
三、垃圾回收流程
G1回收分为四个阶段:
- 初始标记(Stop The World)
- 标记GC Roots直接引用对象
- 并发标记(Concurrent)
- 与工作线程并行标记存活对象
- 最终标记(Stop The World)
- 修正并发阶段的增量引用
- 筛选回收(Concurrent)
- 按回收价值排序Region
- 执行复制算法整理内存
四、核心特性
- 并行与并发
- 多核CPU缩短停顿时间
- 分代抽象管理
- 逻辑分代替代物理分区
- 空间整合
- 整体标记整理 + 局部复制算法
- 减少内存碎片
五、垃圾收集分类
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的着色指针技术
参考资料
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 GoofySatoshi's Blog!
评论