g1是分代+分区的渐进式优化,zgc是单代+并发的颠覆式重构;g1保留分代但用region动态划分,zgc统一单代全堆调度;g1靠预测选region控停顿,zgc借染色指针与读屏障实现亚毫秒stw。

内存模型与分代逻辑
G1 保留传统分代概念,但打破物理隔离:
- 堆被划分为固定大小的 Region(默认最多 2048 个),每个 Region 动态标记为 Eden、Survivor 或 Old 角色
- 仍区分年轻代和老年代,依赖“分代假说”——新对象大多短命,因此 Young GC 频繁、轻量
- 大对象(>50% Region 大小)直接进入 Humongous 区,避免复制开销
ZGC 彻底放弃分代,采用统一的单代内存视图:
- 整个堆视为一个整体,不预设新生/老生边界,所有对象平等参与回收
- 不再按生命周期分批处理,而是通过并发标记+转移,全堆统一调度
- 这种设计规避了分代假说失效时(如长期缓存大量对象)带来的 Mixed GC 压力
停顿控制机制
G1 的停顿可控性来自“预测+优先级”:
- 用户设定 -XX:MaxGCPauseMillis(默认 200ms),G1 在每次 GC 前估算各 Region 回收收益与耗时
- 选择“垃圾最多、整理最快”的 Region 组成 Collection Set,实现“可预测停顿”而非严格上限
- Initial Mark 和 Remark 阶段仍需 STW,时间随 GC Roots 数量增长,Mixed GC 中老年代部分也会带来波动
ZGC 的亚毫秒停顿靠“染色指针 + 读屏障 + 极简 STW”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用指针高 4 位编码对象状态(marked0/marked1/remapped/unused),标记与转移无需修改对象头
- 每次对象读取前插入 读屏障(Load Barrier),自动完成转发、重映射等操作
- 真正 STW 只有三处:初始标记(扫描 GC Roots)、再标记(修正并发变动)、初始转移(选回收集),总时长通常
并发执行能力
G1 实现的是“部分并发”:
- 并发标记阶段与应用线程并行,但需 SATB(Snapshot-At-The-Beginning)写屏障记录变更
- Young GC 完全 STW;Mixed GC 中老年代回收仍需 Stop-The-World 配合转移
- Full GC 是单线程串行,一旦触发即严重卡顿
ZGC 追求“全程并发”:
- 标记、转移、重映射全部与应用线程并发执行
- 依赖虚拟内存多映射(Multi-Mapping)技术,同一物理页映射多个虚拟地址,支持对象原地转移与原子更新
- 无 Full GC 概念,极端情况下也只触发并发周期,不中断业务
适用约束与底层依赖
G1 兼容性强,部署门槛低:
- JDK 7u4 起支持,JDK 9+ 默认服务端 GC
- 运行于任意 64 位 JVM 环境,对 OS 内核无特殊要求
- 调优参数丰富(如 -XX:InitiatingHeapOccupancyPercent、-XX:G1MixedGCLiveThresholdPercent),适合经验型运维
ZGC 对环境有硬性要求:
- JDK 11 引入,JDK 15 起生产就绪;仅支持 64 位 Linux(内核 ≥ 4.1)、Windows(≥ Win10 1903)、macOS(≥ 10.15)
- 需启用大页(Transparent Huge Pages 推荐开启)以减少 TLB 压力
- 参数极简(主要用 -XX:+UseZGC),但故障排查更依赖底层内存映射与屏障行为理解
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










