全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-11 8 分钟 ✍️ juanwangdev

Java垃圾回收算法与选择

不同垃圾回收器有不同特点,需根据应用场景选择合适的收集器。

GC算法对比

算法特点适用场景
标记-清除简单但有碎片CMS(老年代)
标记-复制无碎片但空间利用率低年轻代
标记-整理无碎片但移动成本高Serial Old、Parallel Old

常见垃圾收集器

年轻代收集器

收集器算法特点适用场景
Serial复制单线程,STW单CPU、小堆
ParNew复制多线程版Serial配合CMS
Parallel Scavenge复制关注吞吐量后台计算任务

老年代收集器

收集器算法特点适用场景
Serial Old标记-整理单线程小堆、CMS后备
Parallel Old标记-整理多线程,吞吐量优先配合Parallel Scavenge
CMS标记-清除并发收集,低延迟交互式应用

G1收集器

特性说明
分区模型堆划分为多个Region
可预测停顿设置目标停顿时间
并发标记与应用并发执行
无碎片复制算法整理
适用堆> 4GB

收集器选择策略

按应用类型选择

Bash
┌─────────────────────────────────────┐
│            应用类型判断              │
├─────────────────────────────────────┤
│                                     │
│  ┌─────────────┐    ┌─────────────┐│
│  │ 交互式应用  │    │ 后台任务    ││
│  │ (Web服务)   │    │ (批处理)    ││
│  └             │    │             ││
│  │ 关注延迟    │    │ 关注吞吐量  ││
│  │             │    │             ││
│  │ CMS / G1    │    │ Parallel    ││
│  └─────────────┘    └─────────────┘│
│                                     │
│  ┌─────────────────────────────┐   │
│  │        大堆应用 (>4GB)       │   │
│  │                             │   │
│  │        G1 / ZGC             │   │
│  └─────────────────────────────┘   │
│                                     │
└─────────────────────────────────────┘

按堆大小选择

堆大小推荐收集器
< 100MBSerial
100MB - 4GBParallel / CMS
> 4GBG1
> 16GBZGC / Shenandoah

按JDK版本选择

JDK版本默认收集器推荐升级
JDK 8ParallelCMS/G1(低延迟)
JDK 11G1ZGC(大堆)
JDK 17G1ZGC(生产可用)

各收集器配置

Serial收集器

Bash
-XX:+UseSerialGC
# 适用:单核CPU、小堆、客户端应用

Parallel收集器

Bash
-XX:+UseParallelGC
-XX:+UseParallelOldGC

# 吞吐量参数
-XX:MaxGCPauseMillis=200   # 最大停顿时间
-XX:GCTimeRatio=99         # GC时间占比(1/(1+99)=1%)

# 适用:后台计算、批处理任务

CMS收集器

Bash
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC           # 年轻代用ParNew

# CMS参数
-XX:CMSInitiatingOccupancyFraction=70  # 触发阈值
-XX:+UseCMSCompactAtFullCollection     # Full GC时压缩
-XX:CMSFullGCsBeforeCompaction=0       # 每次都压缩

# 适用:Web应用、交互式系统、低延迟需求

G1收集器

Bash
-XX:+UseG1GC

# G1参数
-XX:MaxGCPauseMillis=200   # 目标停顿时间
-XX:G1HeapRegionSize=4m    # Region大小(1-32MB)
-XX:InitiatingHeapOccupancyPercent=45  # 触发并发标记

# 适用:大堆应用、低延迟需求

ZGC收集器(JDK 15+)

text
-XX:+UseZGC

# ZGC参数
-XX:ZCollectionInterval=5  # 主动GC间隔(秒)

# 适用:超大堆(>16TB)、极低延迟(<10ms)

CMS详解

CMS工作流程

text
┌─────────────────────────────────────────────┐
│                 CMS流程                      │
├─────────────────────────────────────────────┤
│                                             │
│  1.初始标记(STW) ─→ 标记GC Roots直接关联对象 │
│                                             │
│  2.并发标记      ─→ 并发标记所有可达对象     │
│                                             │
│  3.重新标记(STW) ─→ 修正并发期间的变动       │
│                                             │
│  4.并发清除      ─→ 并发清除标记对象         │
│                                             │
│  (可选)并发重置  ─→ 重置CMS状态              │
│                                             │
└─────────────────────────────────────────────┘

CMS优缺点

优点缺点
低延迟有内存碎片
并发收集CPU敏感
适用交互应用浮动垃圾问题
可能触发Full GC

G1详解

G1分区模型

text
┌─────────────────────────────────────┐
│              G1堆分区                 │
├─────────────────────────────────────┤
│ ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐│
│ │E│E│S│S│O│O│O│H│H│ │ │ │ │ │ │ ││
│ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘│
│                                 │
│ E=Eden, S=Survivor              │
│ O=Old, H=Humongous(大对象)      │
│ 空白=空闲Region                  │
└─────────────────────────────────────┘

G1工作模式

模式触发条件特点
Young GCEden区满只收集年轻代
Mixed GC并发标记后年轻代+部分老年代
Full GC内存不足单线程STW

收集器演进趋势

text
Serial → Parallel → CMS → G1 → ZGC/Shenandoah

方向:
1. 单线程 → 多线程 → 并发
2. 关注吞吐 → 关注延迟
3. 整堆收集 → 分区收集
4. STW → 并发 → 几乎无停顿

注意事项

CMS已废弃(JDK14),建议使用G1

G1适合大堆,小堆可能不如Parallel

ZGC在JDK15+生产可用,延迟<10ms

选择收集器需考虑CPU核数和堆大小

调优应从监控数据出发,而非盲目设置

要点总结

  1. 交互应用选CMS/G1,后台任务选Parallel
  2. 小堆(<100MB)用Serial,大堆(>4GB)用G1
  3. JDK 11+默认G1,大堆可升级ZGC
  4. CMS低延迟但有碎片,G1分区可预测停顿
  5. 收集器选择需结合应用类型、堆大小、JDK版本

📝 发现内容有误?点击此处直接编辑

← 上一篇 Java代码级性能优化
下一篇 → Java常见性能问题排查
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库