回答
在 JVM 中,常见的垃圾收集器主要分为两类:低延迟型和高吞吐量型。主要分为如下集中:
- Serial GC(串行垃圾收集器)
单线程垃圾收集器。该垃圾收集器使用单线程回收垃圾,所以它在执行的会停止应用程序(即 STW)。很明显,该垃圾收集器已经不符合我们现有的应用了,当然它还是有一些应用场景的,比如单核处理器或者客户端应用。
- Parallel GC(并行垃圾收集器)
并行垃圾回收器,使用多个线程进行垃圾回收,能够提供较好的吞吐量,适用于高吞吐量的服务端应用。
- CMS GC(Concurrent Mark-Sweep, 并发标记清除收集器)
并发标记清除收集器,其目标是减少老年代垃圾回收的停顿时间,主要使用标记-清除算法,允许应用线程和垃圾收集线程并发执行。整个垃圾回收阶段分为四个阶段:初始标记(STW)、并发标记(不需要暂停应用)、重新标记(STW)、并发清除(不需要暂停应用)。
但是由于 CMS 不会进行压缩,会产生内存碎片,导致老年代明明有足够的内存空间,但由于没连续的内存空间分配内存而进行 Full GC。
- G1 GC(Garbage First,G1 收集器)
G1 收集器是一种适用于大内存和低延迟需求的垃圾收集器。它将堆内存划分为多个大小相等的区域(Region),同时按需回收年轻代和老年代的内存。
G1 通过并发标记和混合回收(Mixed GC)来优化内存管理,减少老年代空间不足时的 Full GC
频率。而且,G1 还支持自动停顿时间控制,我们可以通过参数 -XX:MaxGCPauseMillis
设置期望的最大停顿时间。
- ZGC(Z Garbage Collector)
与 G1 GC 类似,ZGC 也是一款专为超大堆内存设计的低延迟垃圾收集器。其主要特点是极低的停顿时间(小于 10 毫秒)。 ZGC 通过并发处理大多数垃圾回收任务,几乎不会暂停应用线程,非常适合延迟敏感和大规模内存应用。
ZGC 可以处理堆内存从几 MB 到数 TB 的应用,自动分区内存并在后台标记和压缩对象,避免 Full GC 停顿。