首页 > 基础资料 博客日记
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:
- 优点:低延迟(尤其在堆较小时),适合响应时间敏感的应用。
- 缺点:
- 内存碎片严重,可能导致 Full GC 频繁。
- 并发阶段占用 CPU 资源,吞吐量下降。
- 无法处理浮动垃圾(并发期间新产生的垃圾)。
G1:
- 优点:
- 可预测的停顿时间(通过 Region 策略)。
- 大内存下性能更优(如 4GB 以上)。
- 减少内存碎片(标记 - 整理算法)。
- 缺点:
2. 算法复杂度高,小内存场景下可能不如 CMS。
3. 初始标记和筛选回收阶段仍需 STW。
建议:
- 新应用优先考虑 G1,尤其是大内存场景。
- 若应用对延迟极度敏感且堆较小(<4GB),可考虑 CMS,但需注意内存碎片问题。
文章来源:https://www.cnblogs.com/yinyixiao/p/18925854
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
上一篇:效率提升 300%+!开发者必备工具箱!
下一篇:hot100之二叉树上