jvm垃圾回收器

1. 7 种经典的垃圾收集器

在这里插入图片描述

  • 串行回收器:Serial、Serial Old
  • 并行回收器:ParNew、Parallel Scavenge、Parallel old
  • 并发回收器:CMS、G1

Serial 回收器:对于交互较强的应用而言,这种垃圾收集器是不能接受的。现在已经不用了
在这里插入图片描述

ParNew 回收器:并行回收
在这里插入图片描述

Parallel 回收器:吞吐量优先
在这里插入图片描述

Parallel Old 收集器采用了标记-压缩算法,但同样也是基于并行回收和"Stop-the-World"机制

Parallel 收集器和Parallel Old收集器的组合,在 Server 模式下的内存回收性能很不错。在 Java8 中,默认是此垃圾收集器

CMS 回收器:低延迟
它第一次实现了让垃圾收集线程用户线程同时工作。CMS 的垃圾收集算法采用标记-清除算法,只作用于老年代的垃圾回收器

CMS 整个过程分为 4 个主要阶段,即初始标记阶段并发标记阶段重新标记阶段并发清除阶段

在这里插入图片描述

  • 初始标记:这个阶段STW,暂停用户线程,标记GCroot直接关联的对象,也就是根节点。标记完成之后就恢复用户线程。速度块
  • 并发标记:由根节点去找引用链,用户线程与并发标记的线程可以同时工作,并发的。速度慢
  • 重新标记:这个阶段STW,其实在寻找引用链的过程中,因为标记线程和用户线程是同时存在的,所以并发标记的可能不太准确,重新标记阶段就是判断并发标记阶段将对象设标记为垃圾但是可能期间用户线程又将这个对象添加到GCroot的引用链上面了,要将这些对象设置为不是垃圾
  • 并发清除:清除对象、释放空间。由于不需要移动存活对象,所以这个阶段也是可以与用户线程同时并发

由于最耗费时间的并发标记与并发清除阶段都不需要暂停工作,所以整体的回收是低停顿的。
不可避免地将会产生一些内存碎片。那么 CMS 在为新对象分配内存空间时,只能够选择空闲列表执行内存分配。

CMS 的优点

  • 并发收集
  • 低延迟

CMS 的缺点

  • 会产生内存碎片,导致并发清除后,用户线程可用的空间不足。在无法分配大对象的情况下,不得不提前触发 FullGC。
  • CMS 收集器无法处理浮动垃圾。在重新标记阶段是将 垃圾—>>>不是垃圾,但是不能纠正 不是垃圾---->>>>变为垃圾,这部分垃圾是不能被GC的,称为浮动垃圾。

1.1 G1 回收器:区域化分代式

口述:在延迟可控的情况下获得尽可能高的吞吐量,基于区域的垃圾回收算法,对我们的堆划分为了E、S、O、H,不同的区域,在每个region之间采用基于复制的 回收算法,整体上可看做标记压缩算法,G1 的主要优点就是在低的STW时间上,给用户一个好的交互,其实也就是分区的优点,前面几款收集器都是基于很大的堆空间进行回收的,基于分区的回收的话区域内存大小就下降了,那自然STW时间也就下降了,G1主要追求的是在可控的延迟情况下尽量的提交吞吐量。

G1 回收器的特点(优势)

  • 并行性:多cpu下,G1 在回收期间,可以有多个 GC 线程同时工作,有效利用多核计算能力。此时用户线程 STW
  • 并发性:G1 拥有与应用程序交替执行的能力,部分工作可以和应用程序同时执行,因此,一般来说,不会在整个回收阶段发生完全阻塞应用程序的情况
  • 在延迟可控的情况下获得尽可能高的吞吐量

G1 中提供了三种垃圾回收模式:Young GC、Mixed GC 和 Full GC,在不同的条件下被触发。

G1 垃圾回收器的回收过程:
口述:G1这种收集器它可以极大的提交与用户的这种交互,它是基于这种分区的思想来去实现垃圾回收的,对于我们的年轻代老年代,它划分为了一个一个的region,它回收的基本的单位其实可以说是region,其实在造对象时,它首先会分配给E region,当E region用完时,会进行Yong GC,Yong GC其实就是对我们的 E region还有S region进行回收的,Yong GC会比较的频繁,当某一时刻堆的使用达到45%时,当然这个可以设置,默认情况下是45%,会触发混合回收,首先进行一个老年区的并发标记,其实这个过程的话有的是STW的,有的话其实是和用户线程并行的,那其实也是为了减少卡顿时间,更好的和用户交互,细说它的流程的话,其实和CMS有点类似的,都是一个分阶段性的这样一个过程,比如说先标记GCroot,这个阶段是STW的,然后进行并发标记,这个阶段的话是可以和用户线程并行的,它主要就是来标记old区中哪些是垃圾哪些不是垃圾,这个阶段的话会比较耗时,但是可以和用户线程并行的执行,虽然说用户这边会稍微慢点,但是也是可以实时交互的,也正是因为这个原因,导致我们标记的可能不太准确,因为期间可能用户修改了引用,本来是一个垃圾用户将这个垃圾又放到GCroot的引用链上面了,那后面还要进行一个标记的修正,其实也就是在做这个事,是不是垃圾再确认一下,其实整体上来说的话和CMS有很多类似的地方的,只不过G1对old区他没有说对所有的old区全部回收,只是回收一部分,其实它是要判断每个old的region它回收的性价比的,如果这个region垃圾多的话那ok,那吧这些垃圾都回收,那如果垃圾较少的话,其实我们只能释放掉一点点空间,但是还要复制这些old存活的对象到另一个old的region,性价比低,所有他会有一个这种性价比的判断吧,看看回收哪个region比较好,这个的话就是回收选择region的策略,那最后选择好后它会维护一个链表,linkedlist,记录了这些region性价比的一个排序,回收的话我们就依次从高到低的取然后回收,它默认是会分为8次来进行回收的,这样的话也尽可能的降低这种单次的耗时,提升用户体验。
在这里插入图片描述

  • 年轻代 GC(Young GC)会回收e点园区和s区STW
  • 老年代并发标记过程(Concurrent Marking)
  • 混合回收(Mixed GC)期间也会存在Yong GC
    (如果需要,单线程、独占式、高强度的 Full GC 还是继续存在的。它针对 GC 的评估失败提供了一种失败保护机制,即强力回收。)
  1. 当年轻代的 Eden 区用尽时开始年轻代回收;G1 的年轻代收集阶段是一个并行的独占式收集器。在年轻代回收期,G1GC 暂停所有应用程序线程,启动多线程执行年轻代回收。然后从年轻代区间移动存活对象到 Survivor 区间或者老年区间,也有可能是两个区间都会涉及
  2. 当堆内存使用达到一定值(默认 45%)时,开始老年代并发标记过程。
  3. 标记完成马上开始混合回收过程,G1 的老年代回收器不需要整个老年代被回收,一次只需要回收一小部分老年代的Region 就可以了,默认情况下,老年代的内存分段会分 8 次来回收

G1 回收器优化建议
评估 G1 GC 的吞吐量时,暂停时间目标不要太严苛。目标太过严苛表示你愿意承受更多的垃圾回收开销,而这些会直接影响到吞吐量。

在这里插入图片描述

低延迟垃圾收集器(即 ZGC):以低延迟为首要目标的一款垃圾收集器。停颇时间限制在十毫秒以内的低延迟

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值