Java垃圾收集器(Garbage Collectors, GCs)是Java虚拟机(JVM)中负责自动回收不再使用的对象所占用内存的重要组件。Java语言的一大优势就是通过垃圾收集机制实现了自动内存管理,避免了手动内存分配和释放可能导致的内存泄漏和空指针异常等问题。以下是Java平台中常见的几种垃圾收集器:
- Serial GC: 最基础的垃圾收集器,单线程运行,适用于单CPU环境或堆内存较小(< 1GB)的应用场景。Serial GC在进行垃圾回收时会暂停所有应用程序线程(Stop-The-World, STW),依次完成年轻代的Minor GC和老年代的Major GC。由于其简单且高效的特性,对于小型应用或嵌入式设备,尤其是对响应时间要求不高的情况,Serial GC是一个不错的选择。
- Parallel GC (Throughput Collector): 并行版本的Serial GC,适用于多CPU环境,可以在多个CPU核心上并行执行垃圾回收任务以提高效率。在进行Minor GC或Major GC时,依然会发生STW,但因其并行特性,停顿时间相比于Serial GC有所减少。对于关注系统整体吞吐量(即尽可能使应用程序运行时间占总时间的比例最大化)而对短暂的STW停顿有一定容忍度的场景,Parallel GC是理想选择。
- Parallel Old GC: Parallel GC的老年代版本,适用于大内存应用。在进行Major GC时,使用多线程并行回收老年代内存。与Parallel GC配合使用,可以实现整个堆内存的并行回收。
- CMS (Concurrent Mark Sweep) GC: CMS GC是一种以低停顿时间为目标的垃圾收集器,特别适合对响应时间敏感的应用。它主要分为四个阶段:初始标记、并发标记、重新标记(STW)和并发清除。其中,标记和清除阶段可以与应用程序线程并发执行,从而显著减少停顿时间。然而,CMS GC存在一些缺点,如对CPU资源消耗较大、无法处理浮动垃圾可能导致的“Concurrent Mode Failure”等,且已逐渐被其他低延迟收集器(如G1、ZGC、Shenandoah)取代。
- G1 (Garbage-First) GC: G1 GC是一种面向服务端应用的垃圾收集器,旨在满足大内存、低延迟的需求。它将堆内存划分为多个大小相等的Region,并采用停顿预测模型来控制停顿时间。G1 GC通过并发标记、增量压缩等手段实现大部分垃圾回收工作与应用程序并发执行,以达到低停顿的目标。G1 GC会优先回收价值最大的Region(即垃圾最多的Region),因此得名“Garbage-First”。G1 GC适用于大内存(> 4GB)且希望避免长时间STW的应用。
- ZGC (Z Garbage Collector): ZGC是一款追求极致低延迟的垃圾收集器,承诺任何堆大小下停顿时间不超过10毫秒。它采用了颜色指针、读屏障、异步并发等创新技术,能在并发执行垃圾回收的同时保证程序的正常运行,几乎做到真正的“无停顿”(Pauseless)。ZGC适用于对延迟极其敏感且需处理大量数据的Java应用程序。
- Shenandoah GC: Shenandoah GC也是以实现低延迟为目标的垃圾收集器,由Red Hat开发并贡献给OpenJDK。与ZGC类似,Shenandoah通过并发的标记、压缩和引用更新等操作,大幅度降低STW时间。Shenandoah采用“ Brooks Pointer”技术来跟踪对象移动,保证了在垃圾回收期间应用程序可以安全地访问对象。Shenandoah适用于对响应时间要求严苛且内存占用较大的应用场景。
选择合适的垃圾收集器应根据具体应用的需求(如内存大小、响应时间要求、CPU资源、吞吐量需求等)进行权衡。自Java 9开始,JDK提供了统一的-XX:+UseG1GC
、-XX:+UseZGC
或-XX:+UseShenandoahGC
等命令行选项,简化了垃圾收集器的选择和配置。在最新版本的Java中,ZGC和Shenandoah已成为官方推荐的低延迟垃圾收集器。
JDK默认的垃圾收集器随Java版本变化而变化。以下是各版本JDK默认垃圾收集器的情况:
- Java 8及更早版本: 默认垃圾收集器通常是 Parallel GC(也称为Throughput Collector),它在进行垃圾回收时采用多线程并行工作,以提高系统的整体吞吐量。在这些版本中,年轻代通常使用 Parallel Scavenge,而老年代使用 Parallel Old。
- Java 9: 自Java 9开始, G1 (Garbage-First) GC 成为了Java平台的默认垃圾收集器。G1 GC是一种面向服务端应用的垃圾收集器,旨在适应大内存、低延迟的需求。它通过并发标记、增量压缩等手段实现大部分垃圾回收工作与应用程序并发执行,以达到低停顿的目标。
- Java 11及更高版本: 虽然Java 9引入了G1作为默认垃圾收集器,但在后续版本中,特别是从Java 11开始,随着ZGC(Z Garbage Collector)和Shenandoah GC逐渐成熟并加入到OpenJDK中,它们也成为可供选择的高性能垃圾收集器。不过,关于Java 11及之后的具体默认垃圾收集器,官方文档或发布说明并未明确指出是否有变化。通常情况下,如果没有特别声明,G1 GC很可能仍然是默认选择。但开发者可以根据实际需求,通过命令行选项指定使用ZGC或Shenandoah GC等其他收集器。
综上所述,对于Java 8及更早版本,默认垃圾收集器是Parallel GC;对于Java 9及之后版本,特别是Java 11及更高版本,虽然没有明确的官方声明更新默认垃圾收集器,但根据已知信息,G1 GC很可能是持续的默认选择。为了获取最准确的信息,建议查阅对应Java版本的官方文档或发行说明,或者直接使用JVM命令行选项(如-XX:+PrintCommandLineFlags
)来确认实际运行时使用的垃圾收集器。