这一回 ,把 G1 回收器的特性聊通透

👈👈👈 欢迎点赞收藏关注哟

首先分享之前的所有文章 >>>> 😜😜😜
文章合集 : 🎁 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 回收器和其他回收器最大的不同。

欢迎关注这个系列,其他的原理以及写的差不多了,打磨打磨就发出来。

相关推荐
尘浮生几秒前
Java项目实战II基于Spring Boot的光影视频平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·maven·intellij-idea
尚学教辅学习资料8 分钟前
基于SpringBoot的医药管理系统+LW示例参考
java·spring boot·后端·java毕业设计·医药管理
雷神乐乐24 分钟前
File.separator与File.separatorChar的区别
java·路径分隔符
小刘|29 分钟前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
逊嘘1 小时前
【Java语言】抽象类与接口
java·开发语言·jvm
morris1311 小时前
【SpringBoot】Xss的常见攻击方式与防御手段
java·spring boot·xss·csp
monkey_meng1 小时前
【Rust中的迭代器】
开发语言·后端·rust
余衫马1 小时前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng1 小时前
【Rust中多线程同步机制】
开发语言·redis·后端·rust