g1垃圾收集器通过将堆划分为固定大小的region并采用增量式回收与优先级调度,实现可控的gc停顿时间;每个region可动态扮演eden、survivor或old角色,mixed gc按垃圾密度选择old region回收,依赖remembered sets避免全堆扫描,并通过预测模型动态调整回收集以逼近-xx:maxgcpausemillis目标。

G1 垃圾收集器通过将堆划分为固定大小的 Region(区域),配合增量式回收与优先级调度,实现对 GC 停顿时间的可控性。它不追求一次清理全部垃圾,而是每次只回收一部分“收益高、耗时低”的 Region,从而把单次停顿压缩在用户设定的目标范围内(如 -XX:MaxGCPauseMillis=200)。
Region 是 G1 的基本管理单元
整个 Java 堆被等分为多个大小相等的 Region(默认 1~32 MB,由堆总大小自动推算)。每个 Region 可独立扮演 Eden、Survivor 或 Old 角色,不再有物理上的年轻代/老年代边界。这种灵活划分让 G1 能按需选取部分 Region 进行回收,避免传统 GC 中整代扫描带来的长停顿。
- Region 大小在 JVM 启动时确定,运行中不可变
- 一个 Region 不会跨代混存对象(比如不会同时存新生对象和长期存活对象),但逻辑上可动态归属不同代
- Humongous Region 专门存放超过一半 Region 大小的大对象(如大数组),减少碎片化影响
回收过程聚焦“增量 + 优先级”
G1 不再分代整体回收,而是每次 GC 周期中,根据预测模型选出一组最值得回收的 Region(即“回收集”,Collection Set),优先处理那些垃圾比例高、复制成本低、能快速释放空间的 Region。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 通过 Remembered Sets(RSet)跟踪跨 Region 引用,避免全堆扫描——每个 Region 维护自己的 RSet,记录哪些其他 Region 有指向它的引用
- Young GC:只回收所有 Eden + 部分 Survivor Region;Mixed GC:在 Young GC 基础上,额外加入若干 Old Region(依据其垃圾密度排序)
- 停顿目标驱动回收范围:G1 会估算每个 Region 的回收耗时与收益,动态调整本次 Mixed GC 加入多少 Old Region,确保总耗时不超过 MaxGCPauseMillis
预测模型依赖历史数据与实时反馈
G1 内部维护一套统计模型,持续记录各 Region 的回收耗时、存活对象大小、GC 频率等指标,并结合当前堆使用情况预测下一轮回收行为。
- 每次 GC 后更新预测参数(如平均复制速度、对象晋升速率),用于下次选择更精准的回收集
- 如果某次实际停顿超出目标,G1 会自动收紧下次回收的 Region 数量或跳过低优先级 Region
- 可通过 -XX:+PrintGCDetails 和 -XX:+PrintAdaptiveSizePolicy 查看 G1 的自适应决策日志,例如 “target pause time = 200.00ms, predicted young region size = 12”
关键配置影响停顿可控性
仅靠默认参数往往难以稳定达成停顿目标,需合理设置几个核心选项来辅助 G1 做出更好决策。
- -XX:MaxGCPauseMillis=N:设定目标停顿上限(非硬性保证),G1 围绕该值规划回收工作量
- -XX:G1HeapRegionSize=N:显式指定 Region 大小(如 2M),避免默认值导致 Region 过多(增加 RSet 开销)或过少(降低回收粒度)
- -XX:G1MixedGCCountTarget=N:控制 Mixed GC 在并发标记周期后执行几次,影响老年代回收节奏
- 堆不宜过小(建议 ≥ 4GB),否则 Region 数量不足,G1 缺乏调度弹性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










