目录

一、引言

二、经典垃圾回收器

3.1 Serial 系列

3.2 ParNew 系列

3.3 Parallel 系列(吞吐量优先)

3.4 CMS(Concurrent Mark Sweep)——并发标记清除

三、现代垃圾回收器

4.1 G1(Garbage First)垃圾回收器

4.2 ZGC(Z Garbage Collector)

4.3 Shenandoah


一、引言

Java虚拟机的垃圾回收机制是Java语言的核心特性之一,它自动管理内存,使开发者无需手动释放对象

JVM将堆内存划分为新生代(Young Generation)老年代(Old Generation),不同垃圾回收器针对不同代际采用不同算法

二、经典垃圾回收器

3.1 Serial 系列

Serial(串行)垃圾回收器是最基础的垃圾回收器,采用单线程进行垃圾回收。

  • 特点:回收时会暂停所有应用线程(Stop The World)

  • 适用场景:单CPU环境、客户端应用、内存较小的场景

  • 参数-XX:+UseSerialGC

工作方式

  • 新生代:复制算法

  • 老年代:标记-压缩算法


3.2 ParNew 系列

ParNew是Serial新生代的多线程版本。

  • 特点:多线程并行回收,与CMS配合使用

  • 适用场景:多CPU环境、与服务端应用配合CMS

  • 参数-XX:+UseParNewGC


3.3 Parallel 系列(吞吐量优先)

Parallel ScavengeParallel Old组合,关注吞吐量(应用程序运行时间 / 总运行时间)。

  • 特点

    • 可控制吞吐量(-XX:GCTimeRatio

    • 可控制最大停顿时间(-XX:MaxGCPauseMillis

    • 支持自适应调节(-XX:+UseAdaptiveSizePolicy

  • 适用场景:后台计算任务、高吞吐量场景

  • 参数-XX:+UseParallelGC(JDK 8 默认)


3.4 CMS(Concurrent Mark Sweep)——并发标记清除

CMS是一种以获取最短回收停顿时间为目标的垃圾回收器,适用于对响应速度要求高的应用。

回收过程(四个阶段)

阶段 类型 说明
初始标记 STW 标记GC Roots直接关联的对象,速度很快
并发标记 并发 从GC Roots开始遍历对象图,与用户线程并发
重新标记 STW 修正并发标记期间变化的引用,停顿时间较短
并发清除 并发 清除死亡对象,与用户线程并发

特点

  • 优点:低停顿,并发收集

  • 缺点

    • 对CPU资源敏感

    • 无法处理浮动垃圾

    • 产生内存碎片(标记-清除算法)

    • 可能出现"Concurrent Mode Failure"退化为Serial Old

  • 参数-XX:+UseConcMarkSweepGC


三、现代垃圾回收器

4.1 G1(Garbage First)垃圾回收器

G1是JDK 9及以后版本的默认垃圾回收器,它打破了传统的新生代/老年代物理隔离,将堆划分为多个Region(区域)。

核心设计

  • 堆被划分为大小相等的Region(约1MB-32MB)

  • 每个Region可以扮演Eden、Survivor、Old或Humongous(巨型对象)角色

  • G1跟踪每个Region的垃圾堆积价值,优先回收垃圾最多的Region(Garbage First)

回收过程

阶段 类型 说明
初始标记 STW 标记GC Roots,速度很快
并发标记 并发 从GC Roots遍历对象图
最终标记 STW 处理SATB(Snapshot-At-The-Beginning)缓冲
筛选回收 STW 根据停顿预测模型,选择高价值Region回收

特点

  • 可预测的停顿时间(通过-XX:MaxGCPauseMillis设置)

  • 空间整合:基于标记-压缩算法,无内存碎片

  • 大内存场景:推荐堆内存4GB以上

  • 默认参数-XX:+UseG1GC


4.2 ZGC(Z Garbage Collector)

ZGC是JDK 11引入、JDK 15正式产品化的超低延迟垃圾回收器。

核心特性

  • 停顿时间不超过10ms(无论堆内存多大)

  • 支持TB级堆内存(可扩展至16TB)

  • 并发回收:几乎所有阶段都是并发执行

  • 染色指针技术:将指针信息存储在指针中,实现并发标记

适用场景:大内存(>16GB)、低延迟要求的服务端应用

参数-XX:+UseZGC


4.3 Shenandoah

Shenandoah是OpenJDK贡献的低延迟垃圾回收器,与ZGC类似。

核心特性

  • 并发压缩:实现了并发标记、并发压缩

  • 停顿时间与堆内存大小无关

  • 优点:更激进的并发回收

  • 缺点:吞吐量略有下降

参数-XX:+UseShenandoahGC(需要OpenJDK或Oracle JDK特定版本)


场景建议:

场景 推荐回收器
客户端应用、小内存(<512MB) Serial
吞吐量优先(如后台批处理) Parallel
低延迟要求(如Web服务) G1 或 CMS
大内存(>16GB)+ 低延迟 G1 或 ZGC
超低延迟(<10ms) ZGC 或 Shenandoah
JDK 9+ 默认推荐 G1

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐