JVM垃圾回收器详细介绍
Java虚拟机(JVM)的垃圾回收器(Garbage Collector, GC)负责自动管理堆内存,回收不再使用的对象以释放资源。不同的垃圾回收器在算法、性能和应用场景上各有特点。以下是主流垃圾回收器的详细介绍:
一、JVM分代与GC基础
JVM堆内存分为新生代(Young Generation)和老年代(Old Generation):
- 新生代:存放新创建的对象,分为Eden区和两个Survivor区(S0/S1)。采用复制算法(存活对象复制到另一块内存)。
- 老年代:存放长期存活的对象。采用标记-清除或标记-整理算法。
GC类型:
- Minor GC:清理新生代。
- Major GC/Full GC:清理整个堆(包括老年代和新生代),通常停顿时间长。
二、常见垃圾回收器
1. Serial 收集器
- 特点:单线程、Stop-The-World(STW),简单高效。
- 适用场景:客户端应用(如桌面程序),内存小(百MB以内)。
- 算法:新生代(复制算法),老年代(标记-整理)。
- 参数:
-XX:+UseSerialGC
2. Parallel Scavenge(吞吐量优先)
- 特点:多线程并行收集,关注高吞吐量(单位时间处理任务量)。
- 适用场景:后台计算型应用(如批处理)。
- 算法:新生代(复制算法),老年代(标记-整理)。
- 参数:
-XX:+UseParallelGC
(JDK8默认)
3. ParNew 收集器
- 特点:Parallel Scavenge的多线程改进版,与CMS配合使用。
- 适用场景:需低停顿的服务器应用。
- 参数:
-XX:+UseParNewGC
4. CMS(Concurrent Mark Sweep)
- 目标:最小化停顿时间,采用并发标记清除。
- 步骤:
- 初始标记(STW)
- 并发标记
- 重新标记(STW)
- 并发清除
- 缺点:内存碎片、并发阶段占用CPU资源。
- 参数:
-XX:+UseConcMarkSweepGC
5. G1(Garbage-First)
- 目标:平衡吞吐量和延迟,JDK9+默认GC。
- 特点:
- 将堆划分为多个Region,优先回收垃圾最多的区域。
- 预测停顿时间(软实时性)。
- 同时处理新生代和老年代。
- 步骤:类似CMS,但通过SATB(Snapshot-At-The-Beginning)算法处理并发标记。
- 参数:
-XX:+UseG1GC
6. ZGC(Z Garbage Collector)
- 目标:超低停顿(<10ms),支持TB级堆内存。
- 特点:
- 并发标记、整理(无STW)。
- 使用颜色指针和读屏障实现内存映射。
- 适用场景:大内存、低延迟应用(如云原生)。
- 参数:
-XX:+UseZGC
(JDK15+正式支持)
7. Shenandoah
- 目标:与ZGC类似,低停顿且高效。
- 特点:
- 并发复制对象,减少STW时间。
- 通过Brooks指针和读/写屏障实现。
- 参数:
-XX:+UseShenandoahGC
三、对比与选择
回收器 | 并行/并发 | 分代 | 停顿时间 | 吞吐量 | 适用场景 |
---|---|---|---|---|---|
Serial | 单线程 | 是 | 高 | 中 | 客户端应用 |
Parallel | 并行 | 是 | 中 | 高 | 后台计算 |
CMS | 并发 | 是 | 低 | 中 | Web服务 |
G1 | 并发/并行 | 是 | 可控 | 高 | 通用服务端(JDK9+默认) |
ZGC | 并发 | 否 | 极低 | 中高 | 大内存、低延迟 |
Shenandoah | 并发 | 否 | 极低 | 中高 | 类似ZGC,JDK12+正式支持 |
四、选择建议
- 吞吐量优先:Parallel Scavenge。
- 低延迟响应:CMS(小堆)、G1(中等堆)。
- 超大堆/极致低延迟:ZGC或Shenandoah。
- 默认选择:JDK8用Parallel,JDK9+用G1,最新版可尝试ZGC。
五、参数调优示例
- 启用G1:
-XX:+UseG1GC -XX:MaxGCPauseMillis=200
- 启用ZGC:
-XX:+UseZGC -Xmx16g
通过理解不同GC的特性及适用场景,开发者可以根据应用需求(吞吐量、延迟、内存大小)选择最合适的垃圾回收器。