下面是一个详细的表格,总结了Java虚拟机(JVM)中各种垃圾收集器的优缺点,并包括了它们的诞生时间:
垃圾收集器 | 诞生时间 | 优点 | 缺点 |
---|---|---|---|
Serial GC | JDK 1.2 | - 简单易实现 - 适用于单处理器系统或小型应用 - 低内存占用 | - 停顿时间长 - 不适用于多核处理器或需要低延迟的应用 |
Parallel GC | JDK 1.4 | - 提高吞吐量 - 适用于多处理器系统 - 减少停顿时间 | - 在多线程环境下仍可能导致较长的停顿时间 - 对延迟敏感应用不友好 |
Concurrent Mark-Sweep (CMS) GC | JDK 1.4 (改进自JDK 1.2中的CMS) | - 减少停顿时间 - 更适合需要低延迟的应用 - 适合多核处理器 | - 可能导致碎片化 - 处理期间占用较高的CPU - 在某些情况下可能无法完全回收垃圾 |
G1 (Garbage First) GC | JDK 7 Update 4 | - 低停顿时间 - 适用于大内存应用 - 提供了可预测的停顿时间 - 更有效的垃圾回收管理 | - 较为复杂 - 初期可能需要较长的调优时间 - 在一些场景下性能可能不如CMS |
ZGC (Z Garbage Collector) | JDK 11 | - 低停顿时间 - 适用于大内存应用 - 实时性能好 - 对大内存应用支持较好 | - 相对较新,社区支持和成熟度较低 - 需要较新版本的JVM和硬件支持 |
Shenandoah GC | JDK 12 | - 低停顿时间 - 针对大内存系统优化 - 改善了对延迟的控制 - 无需全堆暂停 | - 对较小堆的性能可能不如G1 - 需要较新版本的JVM和硬件支持 |
详细说明
-
Serial GC
- 诞生时间:JDK 1.2(1998年)
- 优点 :
- 简单实现且低内存占用。
- 适合单处理器或小型应用,停顿时间可接受。
- 缺点 :
- 在多核处理器系统上,停顿时间较长,适用性差。
- 不适用于需要高吞吐量或低延迟的应用场景。
-
Parallel GC
- 诞生时间:JDK 1.4(2002年)
- 优点 :
- 提高了吞吐量,适合多处理器系统。
- 通过并行化处理减少了单次垃圾回收的时间。
- 缺点 :
- 在多线程环境下,停顿时间可能仍然较长。
- 对于需要低延迟的应用可能不够友好。
-
Concurrent Mark-Sweep (CMS) GC
- 诞生时间:JDK 1.4(2002年,基于JDK 1.2中的CMS的改进)
- 优点 :
- 设计目标是减少停顿时间,适合需要低延迟的应用。
- 更适合多核处理器。
- 缺点 :
- 可能会导致堆内存碎片化。
- 在处理期间会占用较高的CPU资源。
- 在某些情况下可能无法完全回收垃圾,导致性能下降。
-
G1 (Garbage First) GC
- 诞生时间:JDK 7 Update 4(2011年)
- 优点 :
- 低停顿时间,适合大内存应用。
- 提供可预测的停顿时间。
- 更有效的垃圾回收管理,能够处理大堆内存。
- 缺点 :
- 较为复杂,调优过程可能需要时间。
- 在某些特定场景下,性能可能不如CMS。
-
ZGC (Z Garbage Collector)
- 诞生时间:JDK 11(2018年)
- 优点 :
- 低停顿时间,特别适用于大内存应用。
- 实时性能优秀,对大内存应用支持较好。
- 缺点 :
- 作为较新的收集器,社区支持和成熟度尚待提高。
- 需要较新的JVM和硬件支持。
-
Shenandoah GC
- 诞生时间:JDK 12(2019年)
- 优点 :
- 低停顿时间,针对大内存系统进行优化。
- 改善了对延迟的控制,垃圾回收无需全堆暂停。
- 缺点 :
- 对较小堆的性能可能不如G1。
- 需要较新的JVM和硬件支持,兼容性较低。