这一回 ,把 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 回收器和其他回收器最大的不同。

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

相关推荐
这周也會开心8 小时前
云服务器安装JDK、Tomcat、MySQL
java·服务器·tomcat
hrrrrb9 小时前
【Spring Security】Spring Security 概念
java·数据库·spring
小信丶9 小时前
Spring 中解决 “Could not autowire. There is more than one bean of type“ 错误
java·spring
周杰伦_Jay10 小时前
【Java虚拟机(JVM)全面解析】从原理到面试实战、JVM故障处理、类加载、内存区域、垃圾回收
java·jvm
摇滚侠11 小时前
Spring Boot 3零基础教程,IOC容器中组件的注册,笔记08
spring boot·笔记·后端
程序员小凯13 小时前
Spring Boot测试框架详解
java·spring boot·后端
豐儀麟阁贵13 小时前
基本数据类型
java·算法
_extraordinary_14 小时前
Java SpringMVC(二) --- 响应,综合性练习
java·开发语言
你的人类朋友14 小时前
什么是断言?
前端·后端·安全
程序员 Harry14 小时前
深度解析:使用ZIP流式读取大型PPTX文件的最佳实践
java