JVM 垃圾回收器 Parallel G1 ZGC 选型

FreeGuideOnline 最新 2026-07-09

-XX:+UseParallelGC -XX:MaxGCPauseMillis= -XX:GCTimeRatio= // 吞吐量目标,如 19 代表 GC 时间不超过 5% -XX:ParallelGCThreads= -XX:+UseAdaptiveSizePolicy


---

## G1 GC:平衡的艺术

### 工作原理

G1 将堆划分为多个大小相等的 **Region**(默认约 2048 个),不再严格区分物理连续的新生代、老年代。

- **年轻代回收**:暂停所有应用线程,对 Eden 和 Survivor Region 进行复制回收,过程并行且可控。
- **混合回收(Mixed GC)**:除了年轻代,还会挑选部分高收益的老年代 Region 进行回收,分多次完成,避免一口气处理全部老年代。
- **并发标记**:通过并发标记阶段(与用户线程同时运行)确定存活对象和垃圾占比高的 Region。
- **SATB 算法**:保证并发标记期间对象图的正确性。

### 核心特点

- **可预测的暂停时间**:通过 `-XX:MaxGCPauseMillis` 设定软目标,G1 会尽量将暂停控制在该值内。
- **自动调整吞吐量**:牺牲少许吞吐来换取更低的延迟。
- **对堆大小友好**:几百 MB 到数百 GB 都能较好工作,大堆下优势明显。
- **Full GC 仍有发生**:当并发模式失败或碎片化严重时,可能退化为串行 Full GC,但概率较 Parallel 低。

### 适用场景

- Web 服务器、API 服务、微服务等要求响应延迟在数百毫秒以内的应用。
- 堆内存 4GB – 64GB 的典型服务器配置。
- 需要平滑的 GC 停顿(数十至两百毫秒)的场景。

### 关键 JVM 参数

-XX:+UseG1GC -XX:MaxGCPauseMillis=200 // 常用 100-200ms -XX:InitiatingHeapOccupancyPercent=45 // 启动并发标记周期的堆占用阈值 -XX:G1HeapRegionSize= // 通常自动,可设为 1/2/4/8/16/32M -XX:ConcGCThreads=


---

## ZGC:极低延迟新标杆

### 工作原理

ZGC 使用**染色指针**与**读屏障**技术,实现了即使堆很大也能保证亚毫秒级暂停的奇迹。

- **全并发**:标记、转移、重定位等几乎所有阶段都与用户线程并发进行,STW 只出现在根扫描等极短步骤上。
- **染色指针(Colored Pointers)**:在 64 位指针中嵌入元数据,对象是否被标记、是否已被转移等信息都携带在指针上。
- **多重映射**:物理内存映射到多个虚拟地址,配合指针染色实现高效并发整理。
- **分代 ZGC(JDK 21+)**:借鉴分代思想,进一步提升性能和吞吐量。

### 核心特点

- **暂停时间 < 1ms**:实测中平均暂停在 0.5ms 以下,最大暂停极少超过 1ms。
- **堆大小弹性**:从 8MB 到 16TB 均能保持低暂停特性。
- **牺牲部分吞吐**:因为读屏障等代价,吞吐量通常比 Parallel 低 5%~10%(分代 ZGC 已大幅改善)。
- **无碎片化**:并发重定位过程使得内存始终紧凑。

### 适用场景

- 金融交易系统、实时风控、游戏服务器等极低延迟应用。
- 云原生微服务、响应时间 SLA 严格的 API。
- 大内存( > 32GB)且延迟敏感的系统。

### 关键 JVM 参数

-XX:+UseZGC -XX:+ZGenerational // JDK 21+ 开启分代模式,更优性能 -Xmx // 例如 -Xmx32g -XX:ConcGCThreads= -XX:ZAllocationSpikeTolerance= // 应对突发分配