Java虚拟机(JVM)提供了多种垃圾回收器,以满足不同应用场景的需求。以下是一些主要的Java垃圾回收器类型:
-
Serial Garbage Collector (串行垃圾收集器):
- 特点:使用单线程进行垃圾回收;适用于单核 CPU 或内存较小的场景;在进行垃圾回收时,应用程序会暂停(Stop-the-World)。
- 优点:实现简单;对小型应用(堆内存小)有效。
- 缺点:在多核 CPU 上性能较差,因为只能用单线程进行垃圾回收;停顿时间较长。
- 设置参数:-XX:+UseSerialGC。
-
Parallel Garbage Collector (并行垃圾收集器):
- 特点:多线程回收,适用于多核机器;回收过程中的垃圾收集工作并行执行,减少停顿时间;同样是基于标记-清除和复制算法。
- 优点:提高了垃圾回收的吞吐量(即应用程序的运行效率);适用于对吞吐量要求较高的应用。
- 缺点:停顿时间仍然是可预见的,但相较于串行垃圾回收器有所改善。
- 设置参数:-XX:+UseParallelGC。
-
CMS (Concurrent Mark-Sweep) 并发标记-清除垃圾收集器:
- 特点:主要目的是减少停顿时间,在应用运行时并发地进行垃圾回收;使用并发标记阶段和并发清除阶段来减小应用的停顿时间;CMS 会尽量避免长时间停顿,但不完全消除停顿。
- 优点:大大减少了应用的停顿时间,适用于对低延迟要求较高的应用。
- 缺点:会产生内存碎片(无法避免),可能导致 Full GC;需要更多的 CPU 资源来进行并发标记和清除。
- 设置参数:-XX:+UseConcMarkSweepGC。
-
G1 (Garbage First) Garbage Collector (G1 垃圾收集器):
- 特点:针对大内存应用设计,能够预测垃圾回收的停顿时间;将堆分为多个小块(Region),通过并行和并发方式来回收垃圾;提供了更精细的垃圾回收控制,适用于需要长时间运行的应用。
- 优点:适用于大内存应用,能够进行更加精细的控制;提供了对最大停顿时间的可预测性,能够平衡吞吐量和停顿时间。
- 缺点:在吞吐量方面稍逊色于 Parallel GC;当老年代堆积过多时,仍然可能触发 Full GC。
- 设置参数:-XX:+UseG1GC。
-
ZGC (Z Garbage Collector):
- 特点:极低停顿时间的垃圾回收器,专为大规模内存和低延迟应用设计;采用并发标记和并发回收技术,能够保证在大内存环境下也能维持低延迟;使用 Region 和分布式结构进行回收,支持多线程并行处理。
- 优点:非常低的停顿时间(停顿时间在毫秒级别),适合对延迟非常敏感的应用;支持更大的堆内存(可以达到 TB 级别)。
- 缺点:相对较新的垃圾回收器,适用场景相对有限;内存的管理和回收过程更复杂,需要较高的系统资源支持。
- 设置参数:-XX:+UseZGC。
-
ShenandoahGC(Shenandoah Garbage Collector):
- 特点:类似于 ZGC,Shenandoah 是一个低停顿时间的垃圾回收器;通过并发标记和并发回收来避免长时间的停顿;支持大内存应用,旨在减少垃圾回收的延迟。
- 优点:很低的停顿时间,适合高并发和低延迟的应用;支持大内存并能维持稳定的延迟。
- 缺点:目前的支持度和使用场景较少,仍处于发展阶段。
- 设置参数:-XX:+UseShenandoahGC。
-
Serial Old Garbage Collector(串行老年代垃圾收集器):
- 特点:是与 Serial Garbage Collector(串行垃圾收集器)配套使用的一种垃圾收集器,主要负责老年代(Old Generation)的垃圾回收。
- 优点:适用于需要处理大量老年代垃圾的应用。
- 缺点:停顿时间较长。。
这些垃圾回收器各有优缺点,适用于不同的应用场景。在选择垃圾回收器时,需要根据应用的具体需求,如内存大小、CPU 资源、响应时间要求等因素进行综合考虑。