👈👈👈 欢迎点赞收藏关注哟
首先分享之前的所有文章 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164...
Github : 👉 github.com/black-ant
CASE 备份 : 👉 gitee.com/antblack/ca...
一. 前言
本来是一篇面试文 ,归纳些要点就完事,但是 G1 回收器学起来太有意思了,所以单独拉一篇出来聊一聊 G1 回收器的特性。
这个回收器区别之前的回收器确实有独特的思路,这也是 JDK8 版本里面能用到的比较新的回收器了。
G1 回收器官方对其的定位是 :实现高吞吐量
的同时,以高概率
实现垃圾收集(GC)暂停时间目标
。
👉 文章内容 : 带你了解 G1 回收器的特性,它与其他回收器到底有多少不同?
二. G1 回收器有哪些优秀的特性区别于其他回收器 ?
先假设大家已经学过之前的一些垃圾回收器 ,也能随口说出 1:2
/ 8:1:1
这些常见要点。那么学完就会发现,G1 回收器这些都有 ,但是有的又不是那么明显。
2.1 第一大特性 : Region 分区
G1 回收器最大的特性在于将空间通过 Region 进行了更细致的划分,而不是单纯的靠比例。 通过这种方式可以让每次回收变得可控,每次处理的对象更加单纯。
虽然 G1 通过 Region 划分,但是其逻辑上还是存在新生代 / 老年代的区别 , 而常见的 JVM 配置对其同样有效。
而对于 Region ,存在以下约束条件 :
- G1 回收器最多可以有
2048
个 region 。 每个 Region 的大小相同 ,每个 Region 可以独立回收。 - Region 大小通常在
1M-32M
, 必须是2的倍数
- G1 回收器会优先回收
包含最多垃圾对象的区域
(也有说法说最容易回收的区域),这种规则叫最大垃圾优先
Region 还有一种大对象 Region ,专门用来存放大对象(这个区别于老年代 Region
)- 大对象 Region 不属于两个分代,但是会占用分代的空间,回收时也会被回收掉
2.2 第二大特性 : 独特的回收方式 (垃圾密度 + 停顿时间)
而停顿时间
就更简单了, 都知道垃圾回收的时候有个过程叫 Stop The World
。其目的在于完成全局的扫描或者进行全局清除。
G1 会根据停顿时间模型预测每个区域的 停顿时间
,然后按照指定的停顿时间 选择性收集区域
.
这也是 Region 分区带来的好处之一。 G1 在回收时不会严格的按照年轻代/老年代去回收 ,而是优先收集可以产生大量可回收空间的区域。
在这个过程中 ,会进行适当的对象移动,减少了空间碎片的产生 ,从而避免因为零碎对象带来的碎片整理。
在此期间 ,G1 通过 CSet ,RSet , CardTable 等特殊的数据结构,来提高回收的效率,避免了全堆的扫描。
2.3 第三大特性 : 独特的回收流程
在G1 之前
出现的垃圾回收器里面,通常回收分为新生代回收(MinorGC
), 老年代回收(MajorGC
), 全量回收(FullGC
).
而 G1 回收的核心流程是混合GC模式(MixedGC)
, 这种模式不再基于分代收集,而是基于回收集
(Collection Set) 进行收集,会优先选择收益最大的区域进行收集 (Oracle 文档中的说法是收集空闲空间最大的,也有文档的说法是收集能回收的对象最多的
)。
当然在G1回收器里面 , YoungGC 和 FullGC 还是存在的哦!
👉 首先
随着对象的不断积累,到 Eden 区无法扩展的时候,就会触发 youngGC
. 和常规的 GC 流程一样,对 Eden 和 Survivor 区进行收集, 达到存活阈值的就会进入老年区,未达到的进入 Survivor2 进行保存。
而 G1 回收器最大的不同在于 YoungGC 之外还有个混合回收过程(MixedGC)。混合回收的基础就是 Region + 停顿时间。
它不像 FullGC 一样对全局对象进行回收,它会基于标记的结果 ,同时全堆的Region发起回收 。除了回收全部的新生代 ,还会基于停顿时间选择性的回收老年代 Region。
也就是说,Old Region 的回收依据是回收的效率和收益。
2.4 其他特性
当然 G1 回收器还有一些其他回收的通用特性 :
- 支持并发 : 可以与应用查询交替执行,同时部分阶段可以
同时并发执行
- 支持并行 : 可以多个 GC 线程同时工作 ,
释放多核的能力
- 分代收集 : 尽管 G1 采用了 Region 的结构体系,但是同样有着分代的概念
三. 后续功能全景图
后面大概还有4-5篇来深入的学习一下 G1 回收器 ,大概的内容包括 :
- G1 回收器的全流程
常规的垃圾回收器都会有多个不同回收阶段,在大分类上分为 Partial GC 和 Full GC 两大阶段。又可以细分为 MinorGC 和 MajorGC。
而 G1 回收器稍有不同 ,它多了一个 Mixed阶段。这一篇主要来学习一下 G1 的几个阶段有什么不同。
- G1 回收器的内部结构
上面说了 Region 的特性,但是在 Region 更底层会有多个数据结构用来实现上述说的那些特性,在这一篇会涉及到 RSets 和 CSets 等逻辑概念。
G1 会通过这些概念来实现混合回收和时间预测。
- G1 回收器的配置和效果
这一篇会实践性的来学习一下如何对 G1 进行配置,以及通过这些配置会带来哪些效果。同时还会涉及其中的实践方案以及问题等
总结
这个回收器挺有意思的,不想快速过了,一小块一小块掰开来学。
所以这一篇只简单聊了特性 , 不过于深入原理,主要目的在于了解 G1 回收器和其他回收器最大的不同。
欢迎关注这个系列,其他的原理以及写的差不多了,打磨打磨就发出来。