CMS和G1

CMS的回收流程

CMS的核心思想就是用并发换停顿时间,7个阶段只有两个需要STW,其他都是和应用线程一起跑,代价是cpu占用高,有内存碎片,可能并发失败

  1. 初始标记:STW,只标记GC Roots直接可达的对象,速度很快,通常几毫米
  2. 并发标记:和应用线程并发跑,从根递归扫描整个老年代,耗时最长,但不停顿
  3. 并发预清理:扫描卡表脏区域,标记新晋升对象,为重新标记分担工作
  4. 可中断预清理:等待一次Young GC ,减少年轻代对象数量,进一步减轻重新标记压力
  5. 重新标记:STW,这是CMS的瓶颈,修正并发期间变动,需要重新扫描GC Roots,年轻代,脏区域
  6. 并发清理:标记清除算法回收垃圾,不压缩,不移动,会有内存碎片
  7. 并发重置:重置状态,为下一次回收做准备
它的优缺点

优点:低停顿,响应快

  • 缺点: 标记清除算法导致的内存碎片
    • 并发阶段占用cpu,影响吞吐量
    • 需要预留空间,老年代满了就会触发Concurrent Mode Failure,退化成串行 Full GC
    • 浮动垃圾(并发清理时新产生的垃圾只能下次处理)

G1是什么

G1从jdk9之后成为默认GC,它的设计目的是用可控的停顿时间内,尽量高的吞吐量

它不再像传统GC把堆划分为连续的新生代,老年代,而是切成几百上千个大小相等的小格子,没有物理上的分界,Eden、Survivor、老年代都是 Region 的逻辑集合,数量可以动态调整.并且它是全堆管理,每次GC时它会优先记录每个Region的垃圾比例,每次GC时它挑选垃圾最多的几个Region优先回收

G1的流程

分为两大块:并发标记和对象拷贝
并发标记 :基于SATB算法,分四个阶段

  • 初始标记:通常搭便车,在YoungGC的STW后完成,标记GC Roots字节引用的对象
  • 并发标记:目的和G1相似都是遍历对象图,标记存活对象,但核心机制是SATB快照算法(记录谁丢失了引用,保证快照中的对象不会被回收)
  • 最终标记:STW,处理SATB队列积压的引用变更记录,修正并发期间的对象的变动,将漏掉的对象补标,确保标记结果的准确性
  • 清理阶段:STW,基于bitmap统计每个Region的存活对象,若全空则立即回收,计算回收价值,更新CSET候选列表
    对象拷贝 :G1回收一个Region时,不会原地清理垃圾,而是把这个Region存活的对象拷贝到另一个空的Region,然后直接把原Region清空
    这个阶段是STW的,根据标记结果和回收价值,选一批Region组成Collection Set,然后把CSet里的存活对象拷贝到新的Region。它的性能瓶颈就在此:存活对象越多,拷贝时间越长,G1会优先选择垃圾多的Region回收
    G1的两个回收模式
    Young GC:只回收Eden和Survivor的Region,触发条件是Eden区满了
    Mixed GC:会回收所有的年轻代,和一部分老年代,这个参数默认是45%,分多次回收老年代,每次挑垃圾比例高的Region清理
    什么叫"漏标"?哪个算法解决了它?
    "漏标"是指一个本应存活的对象被错误标记成垃圾。CMS 和 G1 都解决了漏标问题,但方式不同:
  • CMS(增量更新):记录"谁引用了新对象",重新标记阶段重新扫描。
  • G1(SATB):记录"谁丢失了引用",保证快照中的对象不会被回收
相关推荐
码智社22 分钟前
JSON 零基础到资深全体系教程
java·json
峥嵘life1 小时前
Android WiFi 热点 Channel 信道 和 Frequency 频率 转换总结
android·开发语言
wgego1 小时前
基础的反序列化一些总结(php和java)
java·开发语言·笔记
冻柠檬飞冰走茶2 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
机建狂魔2 小时前
Codex 接入第三方模型 API 实战:以 Mimo 为例
java·服务器·数据库·ai·ai编程·codex
山峰哥3 小时前
数据库工程与SQL调优:从慢查询到秒级响应的实战之路
java·开发语言·数据库·sql·深度优先·启发式算法
乐观的Terry3 小时前
11、发布系统-用户认证与权限体系
java·spring boot·spring·spring cloud·mybatis
前端开发张小七3 小时前
Java 学习笔记 · 第二课:面向对象核心(封装、继承、多态)及接口与异常
java·后端·程序员
wangjialelele3 小时前
Selenium4 + Java Web自动化测试入门指南:从环境搭建到常用操作详解
java·开发语言·前端·测试工具·自动化
Awna3 小时前
Golang 大小写可见性规范
开发语言·后端·golang