12. JVM的垃圾回收器
1. JVM有哪些垃圾回收器
- 串行垃圾收集器
- 并行垃圾收集器
- CMS(并发)垃圾收集器
- G1垃圾收集器
1. 串行垃圾回收器(Serial GC)
Serial和Serial Old串行垃圾收集器,是指使用单线程进行垃圾回收,堆内存较小,适合个人电脑
Serial 作用于新生代,采用复制算法
Serial Old 作用于老年代,采用标记-整理算法
算法:新生代(Copying),老年代(Mark-Sweep-Compact)
特点:
单线程执行,适用于单核 CPU 环境
垃圾回收时会 STW(Stop-The-World),暂停所有应用线程
适用于 客户端应用 或 小型应用
垃圾回收时,只有一个线程在工作,并且java应用中的所有线程都要暂停(STW),等待垃圾回收的完成。
2. 并行垃圾回收器(Parallel GC / Throughput GC)
Parallel New和Parallel Old是一个并行垃圾回收器,JDK8默认使用此垃圾回收器
Parallel New作用于新生代,采用复制算法
Parallel Old作用于老年代,采用标记-整理算法
算法:新生代(Copying),老年代(Mark-Sweep-Compact)
特点:
多线程并行 执行垃圾回收,提高吞吐量
适用于 多核 CPU 环境
默认 GC 在 Java 8 及之前版本
适用于 后台计算型应用(如批处理任务)
垃圾回收时,多个线程在工作,并且java应用中的所有线程都要暂停(STW),
等待垃圾回收的完成
3. 并行老年代垃圾回收器(Parallel Old GC)
算法:老年代采用 Mark-Sweep-Compact(并行优化版)
特点:
与 Parallel GC 搭配使用,优化老年代回收
相比 Parallel GC,老年代回收效率更高
4. CMS 垃圾回收器(Concurrent Mark-Sweep GC)
CMS全称 Concurrent Mark sweep,是一款并发的、使用标记-清除算法的垃圾回收器,该回收器是针对老年代垃圾回收的,是一款以获取最短回收停顿时间为目标的收集器,停顿时间短,用户体验就好。其最大特点是在进行垃圾回收时,应用仍然能正常运行。
算法:老年代采用 并发标记-清除(CMS)
特点:
并发执行,减少 STW 时间,适用于 低延迟 应用
不压缩内存,可能导致 内存碎片
在 Java 14 后被移除
5. G1 垃圾回收器(Garbage-First GC)
算法:分 Region 收集(标记-整理 + 复制)
特点:
Java 9 及以后版本的默认 GC
适用于 大堆内存(4GB+) 和 低延迟 场景
可预测停顿时间(通过设定
-XX:MaxGCPauseMillis
)将堆划分为多个 Region,优先回收垃圾最多的 Region
垃圾回收器对比
GC 名称 | 适用场景 | 算法 | 并行/并发 | 低延迟 | 大堆支持 |
---|---|---|---|---|---|
Serial GC | 单核、客户端 | 复制 + 标记-整理 | 单线程 | ❌ | ❌ |
Parallel GC | 高吞吐量 | 复制 + 标记-整理 | 多线程 | ❌ | ❌ |
CMS GC | 低延迟(已废弃) | 并发标记-清除 | 并发 | ✅ | ❌ |
G1 GC | 平衡吞吐和延迟 | 分 Region 收集 | 并发 | ✅ | ✅(4GB+) |
JDK 版本 | 默认 GC | 适用场景 | 特点 |
---|---|---|---|
JDK 8 | Parallel GC | 高吞吐量计算任务 | 多线程并行,STW 较长 |
JDK 17 | G1 GC | 平衡吞吐与延迟 | 分 Region 回收,低停顿 |
2. 问题总结
2.1 说一下 JVM 的垃圾回收器?
在jvm中,实现了多种垃圾收集器,包括:
- 串行垃圾收集器:Serial GC、Serial Old GC
- 并行垃圾收集器:ParallelOld GC、ParNewGC
- CMS(并发)垃圾收集器:CMS GC,作用在老年代
- G1垃圾收集器,作用在新生代和老年代
上一篇 下一篇