常见 GC 垃圾收集器对比分析

大家好,这里是架构资源栈 !点击上方关注,添加"星标",一起学习大厂前沿架构!

Java 虚拟机中存在多种垃圾收集器,各有优劣,适用于不同的业务场景。下面我们对常见的几种垃圾收集器进行系统性梳理与对比,助你在日常开发与性能调优中游刃有余。

1. Serial 收集器(串行收集器)

  • 特点:单线程、Stop The World。
  • 工作方式:新生代使用复制算法,老年代使用标记-整理。
  • 优点:实现简单,内存占用少,适合单核环境或内存较小的场景。
  • 缺点:GC 期间所有用户线程停顿,影响体验。

✅ 适合场景:单核处理器、Client 端应用、小内存部署。


2. ParNew 收集器

  • 特点:Serial 的多线程版本,支持并行收集新生代。
  • 工作方式:新生代使用复制算法,常与 CMS 搭配使用。
  • 优点:多核 CPU 环境下比 Serial 更高效。
  • 缺点:老年代仍需配合 CMS,否则效果一般。

✅ 适合场景:多核 CPU + CMS 收集器组合。


3. CMS(Concurrent Mark Sweep)收集器

  • 特点:老年代并发收集,响应时间优先。

  • 工作方式:标记-清除,采用"初始标记 → 并发标记 → 重新标记 → 并发清除"四步。

  • 优点

    • 并发回收,停顿时间短。
    • 用户线程与 GC 线程并发执行,提升响应性。
  • 缺点

    • 会产生内存碎片。
    • 可能出现"Concurrent Mode Failure",需要预留空间进行 Full GC。

✅ 适合场景:对响应时间敏感的应用,如电商、交易系统。


4. G1(Garbage First)收集器

  • 特点:面向服务端,兼顾吞吐与低停顿。

  • 工作方式:将堆划分为多个 Region,混合使用多种算法,采用并发标记 + 并发压缩。

  • 优点

    • 支持大堆(>4GB)。
    • 可预测的低延迟,GC 可配置暂停时间(-XX:MaxGCPauseMillis)。
    • 内存整理后无碎片。
  • 缺点

    • 单次 GC 性能略低于 CMS。
    • 调优复杂。

✅ 适合场景:对响应延迟和吞吐有双重要求的大型服务系统。


5. ZGC(Z Garbage Collector)

  • 特点:低延迟收集器(Pause < 10ms),JDK11+。

  • 工作方式:Region + 并发标记 + 并发重定位,使用着色指针。

  • 优点

    • 停顿时间极短,<10ms。
    • 支持大内存,最高达 16TB。
  • 缺点

    • 暂不支持 Mac、JDK8。
    • 吞吐量稍逊于 G1。

✅ 适合场景:超大堆内存、低延迟系统,如金融风控、在线推荐系统。


6. Shenandoah 收集器

  • 特点:OpenJDK 社区开发,低延迟收集器(Pause < 10ms),JDK12+。

  • 工作方式:Region 化 + 并发标记 + 并发压缩,支持并发整理堆。

  • 优点

    • 停顿时间短,几乎与堆大小无关。
    • 支持压缩,内存碎片少。
  • 缺点

    • 吞吐略低。
    • 需要额外 CPU 资源支持并发标记。

✅ 适合场景:注重低停顿、超大堆、追求实时体验的业务。


GC 收集器对比总结表格

收集器 新生代算法 老年代算法 并发/并行 停顿时间 吞吐量 特点
Serial 复制 标记-整理 单线程,简单可靠
ParNew 复制 标记-整理 并行 CMS 搭档,支持多线程
CMS 复制 标记-清除 并发 响应快,但有内存碎片
G1 复制 + 整理 标记-整理 并行 + 并发 可调 中高 面向大内存,支持预测暂停
ZGC 标记-整理 标记-整理 全并发 极短 支持 16TB,大内存低延迟
Shenandoah 标记-整理 标记-整理 全并发 极短 停顿时间与堆大小无关

本文由博客一文多发平台 OpenWrite 发布!

相关推荐
Escalating_xu4 分钟前
【Linux】基础 I/O 深度解析:FILE、文件描述符、open/read/write、重定向与缓冲区
java·linux·服务器
城管不管7 分钟前
MySQL 慢查询完整排查
java·服务器·jvm·数据库·mysql·spring·面试
ZC跨境爬虫18 分钟前
LeetCode 88. 合并两个有序数组(双指针详解 + Java Python 实现)
java·python·算法·leetcode
北风toto29 分钟前
研发效能与后端核心技术全景指南:从CI/CD到共性组件实战
java·开发语言·ci/cd
01二进制代码漫游日记33 分钟前
C++基础入门速通
java·开发语言·c++
Herbert_hwt34 分钟前
第六章 Java深入理解接口、函数式接口与lambda表达式
java·开发语言·算法
API快乐传递者1 小时前
电商竞品分析接口实战指南:从数据采集到决策洞察的全链路方案
java·python
程序员黑豆8 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
风流 少年9 小时前
Spring AI 2.0:Memory
java·后端·spring
码匠许师傅9 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试