首页 > 基础资料 博客日记

G1和CMS垃圾回收器的区别

2025-06-12 17:30:02基础资料围观23

本篇文章分享G1和CMS垃圾回收器的区别,对你有帮助的话记得收藏一下,看Java资料网收获更多编程知识

一、核心设计目标

CMS:尽可能减少STW(Stop-The-World)时间,实现与用户线程的高并发。
G1:兼顾低延迟和高吞吐量,在大内存场景下提供可预测的停顿时间。

二、内存管理模型

CMS

  • 分代设计:严格区分新生代(Eden、Survivor)和老年代,各自独立回收。
  • 内存碎片:采用 “标记 - 清除” 算法,可能产生大量内存碎片,导致 Full GC 频繁。

G1

  • Region 分区:将堆划分为多个大小相等的Region(如 2MB / 个),每个 Region 动态扮演 Eden、Survivor 或 Old 区域。
  • 跨代引用:通过 Remembered Set(RSet)记录跨 Region 引用,避免扫描整个堆。
  • Humongous 区域:专门存储大对象(超过 Region 大小的 50%),减少内存碎片。

三、GC 算法流程

CMS:

  • 初始标记(STW):标记 GC Roots 直接关联的对象。
  • 并发标记:与用户线程并行,遍历所有可达对象。
  • 重新标记(STW):修正并发期间用户线程修改的对象引用。
  • 并发清除:与用户线程并行,清理未标记的对象。
    G1:
  • 初始标记(STW):标记 GC Roots 直接关联的对象。
  • 并发标记:与用户线程并行,遍历所有可达对象。
  • 最终标记(STW):修正并发期间的引用变更。
  • 筛选回收(STW):根据 Region 的垃圾占比,优先回收价值高的 Region(Garbage-First 策略)。

四、STW 时间与性能

维度 CMS G1
STW 时间 并发标记和清除阶段不 STW,但最终标记可能较长(尤其是堆大时)。 筛选回收阶段可控制 STW 时间(通过-XX:MaxGCPauseMillis参数)。
内存碎片 标记 - 清除算法导致碎片化,可能触发 Full GC。 标记 - 整理算法(筛选回收阶段),减少碎片。
吞吐量 并发阶段不影响用户线程,但 GC 线程与用户线程竞争 CPU。 筛选回收时需 STW,但可通过调整 Region 数量优化。

五、优缺点对比

CMS:

  • 优点:低延迟(尤其在堆较小时),适合响应时间敏感的应用。
  • 缺点:
    1. 内存碎片严重,可能导致 Full GC 频繁。
    2. 并发阶段占用 CPU 资源,吞吐量下降。
    3. 无法处理浮动垃圾(并发期间新产生的垃圾)。

G1:

  • 优点:
    1. 可预测的停顿时间(通过 Region 策略)。
    2. 大内存下性能更优(如 4GB 以上)。
    3. 减少内存碎片(标记 - 整理算法)。
  • 缺点:
    2. 算法复杂度高,小内存场景下可能不如 CMS。
    3. 初始标记和筛选回收阶段仍需 STW。

建议:

  • 新应用优先考虑 G1,尤其是大内存场景。
  • 若应用对延迟极度敏感且堆较小(<4GB),可考虑 CMS,但需注意内存碎片问题。

文章来源:https://www.cnblogs.com/yinyixiao/p/18925854
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云