JVM—垃圾回收器有哪些
目录
3.4 CMS(Concurrent Mark Sweep)——并发标记清除
一、引言
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 Scavenge和Parallel 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 |

更多推荐




所有评论(0)