在 Java 中,垃圾收集器(Garbage Collector, GC)是 JVM 的重要组成部分,负责自动管理内存,回收不再使用的对象。Java 提供了多种垃圾收集器,每种收集器都有其特定的使用场景和优缺点。以下是 Java 中常见的垃圾收集器:
1. Serial 收集器
- 特点:
- 单线程收集器。
- 使用 标记-复制算法(新生代)和 标记-整理算法(老年代)。
- 在垃圾回收时会暂停所有工作线程(Stop-The-World, STW)。
- 适用场景:
- 单核 CPU 或小型应用。
- 客户端模式(如 Java 桌面应用)。
- 启用参数:
-XX:+UseSerialGC
2. Parallel(吞吐量优先)收集器
- 特点:
- 多线程收集器。
- 使用 标记-复制算法(新生代)和 标记-整理算法(老年代)。
- 目标是最大化吞吐量(Throughput),即减少垃圾回收时间占程序总运行时间的比例。
- 适用场景:
- 多核 CPU。
- 适合后台计算任务,对延迟不敏感的应用。
- 启用参数:
-XX:+UseParallelGC
(新生代)-XX:+UseParallelOldGC
(老年代)
3. CMS(Concurrent Mark-Sweep)收集器
- 特点:
- 以最小化停顿时间为目标。
- 使用 标记-清除算法(老年代)。
- 大部分垃圾回收工作与用户线程并发执行。
- 分为四个阶段:初始标记、并发标记、重新标记、并发清除。
- 适用场景:
- 对延迟敏感的应用(如 Web 服务)。
- 老年代垃圾回收。
- 缺点:
- 会产生内存碎片。
- 对 CPU 资源敏感。
- 在 JDK 9 中被标记为废弃,JDK 14 中移除。
- 启用参数:
-XX:+UseConcMarkSweepGC
4. G1(Garbage-First)收集器
- 特点:
- 面向服务端应用的垃圾收集器。
- 将堆内存划分为多个区域(Region),优先回收垃圾最多的区域(Garbage-First)。
- 使用 标记-复制算法。
- 目标是平衡吞吐量和低延迟。
- 支持可预测的停顿时间模型。
- 适用场景:
- 大内存(堆内存 > 4GB)。
- 对延迟和吞吐量都有要求的应用。
- 启用参数:
-XX:+UseG1GC
5. ZGC(Z Garbage Collector)
- 特点:
- 低延迟垃圾收集器。
- 支持超大堆内存(TB 级别)。
- 停顿时间不超过 10ms。
- 使用 染色指针(Colored Pointers)和 读屏障(Load Barrier)技术。
- 适用场景:
- 对延迟要求极高的应用(如实时系统)。
- 超大堆内存的应用。
- 启用参数:
-XX:+UseZGC
(JDK 11 引入,JDK 15 后正式支持)
6. Shenandoah 收集器
- 特点:
- 低延迟垃圾收集器。
- 与 ZGC 类似,但实现方式不同。
- 停顿时间与堆大小无关。
- 使用 读屏障 和 并发压缩 技术。
- 适用场景:
- 对延迟要求极高的应用。
- 大堆内存应用。
- 启用参数:
-XX:+UseShenandoahGC
(JDK 12 引入)
7. Epsilon 收集器
- 特点:
- 无操作的垃圾收集器。
- 不进行任何垃圾回收,堆内存耗尽时直接抛出
OutOfMemoryError
。
- 适用场景:
- 性能测试或极短生命周期的应用。
- 启用参数:
-XX:+UseEpsilonGC
垃圾收集器对比
收集器 | 目标 | 算法 | 适用场景 | 停顿时间 |
---|---|---|---|---|
Serial | 单线程 | 标记-复制/标记-整理 | 单核 CPU、小型应用 | 长 |
Parallel | 吞吐量优先 | 标记-复制/标记-整理 | 多核 CPU、后台计算任务 | 中等 |
CMS | 低延迟 | 标记-清除 | 对延迟敏感的应用 | 短 |
G1 | 平衡 | 标记-复制 | 大内存、对延迟和吞吐量有要求 | 可预测 |
ZGC | 极低延迟 | 染色指针 | 超大堆内存、实时系统 | 极短(<10ms) |
Shenandoah | 极低延迟 | 并发压缩 | 大堆内存、对延迟要求极高 | 极短 |
Epsilon | 无操作 | 无 | 性能测试、极短生命周期应用 | 无 |
如何选择垃圾收集器?
- 如果应用对延迟不敏感,追求高吞吐量,可以选择 Parallel。
- 如果应用对延迟敏感,且堆内存较小,可以选择 CMS。
- 如果堆内存较大,且需要平衡吞吐量和延迟,可以选择 G1。
- 如果堆内存非常大(TB 级别),且对延迟要求极高,可以选择 ZGC 或 Shenandoah。
- 如果不需要垃圾回收(如性能测试),可以选择 Epsilon。
THE END
暂无评论内容