JVM 几种垃圾回收器对比

垃圾收集器回收区域回收算法单/多线程备注
Serial新生代标记-复制单线程
Serial Old老年代标记-整理单线程Serial 的老年代版本;与 Parallel Scavenge 收集器搭配使用(jdk1.5以前);用作 CMS 收集器的后备方案
ParNew新生代标记-复制多线程Serial 的多线程版本
Parallel Scavenge新生代标记-复制多线程其目标是达到一个可控制的吞吐量
Parallel Old老年代标记-整理多线程Parallel Scavenge 的老年代版本
CMS老年代标记-清除混合重要 、并发。(ParNew是CMS默认的新生代垃圾回收器)
G1整堆标记-复制?混合并发
ZGC整堆标记-复制?并发
  • CMS工作过程分为 4 个步骤:

    • 初始标记

      暂停所有的其他线程,并记录下直接与 root 相连的对象,速度很快 ;

    • 并发标记

      同时开启 GC 和用户线程,用一个闭包结构去记录可达对象。但在这个阶段结束,这个闭包结构并不能保证包含当前所有的可达对象。因为用户线程可能会不断的更新引用域,所以 GC 线程无法保证可达性分析的实时性。所以这个算法里会跟踪记录这些发生引用更新的地方;

    • 重新标记

      重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短;

    • 并发清除

      开启用户线程,同时 GC 线程开始对未标记的区域做清扫。

  • CMS回收示意图

    CMS 收集器

  • CMS 收集器有 3大缺点:浮动垃圾,并发失败以及内存碎片。

G1工作过程:

当不需要清理老年代时,只回收新生代。

当整堆占用达到指定阈值(初始值45%),需要回收老年代:

具体过程如下:

  1. 先进行一次年轻代回收过程,这个过程是Stop-The-World的。

   老年代的回收基于年轻代的回收(比如需要年轻代回收过程对于根对象的收集,初始的存活对象的标记)。

     2.恢复应用程序线程的执行。

     3.开始老年代对象的标记过程。

   此过程是与应用程序线程并发执行的。标记过程会记录弱引用情况,还会计算出每个分段的对象存活数据(比如分段内存活对象所占的百分比)。

     4.Stop-The-World,然后 重新标记(Remark)。

   此阶段重新标记前面提到的STAB队列中的对象(例子中的C对象),还会处理弱引用。

     4.回收百分之百为垃圾的内存分段。

   注意:不是百分之百为垃圾的内存分段并不会被处理,这些内存分段中的垃圾是在混合回收过程(Mixed GC)中被回收的。

   由于Humongous对象会独占整个内存分段,如果Humongous对象变为垃圾,则内存分段百分百为垃圾,所以会在第一时间被回收掉。

    6.恢复应用程序线程的执行。

G1 回收图示

img

老年代回收简略版:

G1垃圾回收器的运行过程大致可划分为以下四个步骤:

  1. 初始标记(initial mark),标记了从GC Root开始直接关联可达的对象。STW(Stop the World)执行。

  2. 并发标记(concurrent marking),和用户线程并发执行,从GC Root开始对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找出要回收的对象、

  3. 最终标记(Remark),STW,标记再并发标记过程中产生的垃圾。

  4. 筛选回收(Live Data Counting And Evacuation),制定回收计划,选择多个Region 构成回收集,把回收集中Region的存活对象复制到空的Region中,再清理掉整个旧 Region的全部空间。需要STW。

可预测的停顿:这是 G1 相对于 CMS 的另一个大优势,降低停顿时间是 G1 和 CMS 共同的关注点,但 G1 除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为 M 毫秒的时间片段内,消耗在垃圾收集上的时间不得超过 N 毫秒。

ZGC 回收图示

img

ZGC只有三个STW阶段:初始标记再标记初始转移。其中,初始标记和初始转移分别都只需要扫描所有GC Roots,其处理时间和GC Roots的数量成正比,一般情况耗时非常短;再标记阶段STW时间很短,最多1ms,超过1ms则再次进入并发标记阶段。即,ZGC几乎所有暂停都只依赖于GC Roots集合大小,停顿时间不会随着堆的大小或者活跃对象的大小而增加。与ZGC对比,G1的转移阶段完全STW的,且停顿时间随存活对象的大小增加而增加。

参考:

JVM垃圾回收详解(重点) | JavaGuide

肝了一周,彻底弄懂了 CMS收集器原理,这个轮子造的真值!-腾讯云开发者社区-腾讯云

https://www.cnblogs.com/yufengzhang/p/10571081.html

G1垃圾回收器的工作流程-阿里云开发者社区

新一代垃圾回收器ZGC的探索与实践 - 美团技术团队

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值