【JVM】—深入理解G1回收器—回收过程详解

深入理解G1回收器—回收过程详解

⭐⭐⭐⭐⭐⭐
Github主页👉https://github.com/A-BigTree
笔记链接👉https://github.com/A-BigTree/Code_Learning
⭐⭐⭐⭐⭐⭐

如果可以,麻烦各位看官顺手点个star~😊

文章目录

  • 深入理解G1回收器—回收过程详解
    • 1 与CMS回收过程做比较
    • 2 G1垃圾回收过程详解
    • 3 全局并发标记Global concurrent marking
    • 4 拷贝存活对象Evacuation


关于G1相关概念请参考【JVM】—深入理解G1回收器——概念详解

1 与CMS回收过程做比较

从名字中的Mark Sweep这两个词可以看出,CMS 收集器是一种 标记-清除”算法实现的,它的运作过程相比于前面几种垃圾收集器来说更加复杂一些。整个过程分为四个步骤:

  • 初始标记: 暂停所有的其他线程,并记录下直接与 root 相连的对象,速度很快 ;
  • 并发标记: 同时开启 GC 和用户线程,用一个闭包结构去记录可达对象。但在这个阶段结束,这个闭包结构并不能保证包含当前所有的可达对象。因为用户线程可能会不断的更新引用域,所以 GC 线程无法保证可达性分析的实时性。所以这个算法里会跟踪记录这些发生引用更新的地方。
  • 重新标记: 重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短
  • 并发清除: 开启用户线程,同时 GC 线程开始对未标记的区域做清扫。
    在这里插入图片描述

2 G1垃圾回收过程详解

G1 收集器的运作大致分为以下几个步骤:

  • 初始标记:这是一次SWT事件。对于G1正常的年轻代 GC 上。标记可能引用老生代对象的新生代区域(引用根区域);
  • 并发标记: 在整个堆中查找活动对象,与应用线程并行,此阶段可能会被新生代GC中断;
  • 最终标记:为了修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录,虚拟机将这段时间对象变化记录在线程的 Remembered Set Logs 里面,最终标记阶段需要把 Remembered Set Logs 的数据合并到 Remembered Set 中。这阶段需要停顿线程,但是可并行执行。
  • 筛选回收:首先对各个 Region 中的回收价值和成本进行排序,根据用户所期望的 GC 停顿时间来制定回收计划。此阶段其实也可以做到与用户程序一起并发执行,但是因为只回收一部分 Region,时间是用户可控制的,而且停顿用户线程将大幅度提高收集效率。

在这里插入图片描述

G1收集可以分为两大部分:

  • 全局并发标记(global concurrent marking);
  • 拷贝存活对象(evacuation),或者叫迁移;

3 全局并发标记Global concurrent marking

标记老年代region,提供统计结果供Mixed GC使用,选取收益高的老年代region回收,帮助回收老年代对象。

关于G1相关概念请参考【JVM】—深入理解G1回收器——概念详解

Global concurrent marking基于SATB形式的并发标记,分为以下几个阶段:

  1. The Initial Mark Phase(STW):扫描GC roots直接可达对象,并将他们的字段压入扫描栈(marking stack)等待后续扫描。初始标记阶段借用young gc的暂停,没有额外的单独暂停阶段,所以在The Initial Mark Phase发生在young gc之后。

在这里插入图片描述

  1. The Concurrent Marking Phase:从扫描栈(marking stack)中递归查找所有引用可达对象。和用户线程并行执行。

在这里插入图片描述

  1. The Remark Phase(STW):完成存活对象的标记,标记那些在并发标记阶段发生变化的对象,将被回收。

在这里插入图片描述

  1. The Cleanup Phase (STW and Concurrent):old region存活对象情况统计(确定未使用region和Mixed GC收集候选region)(Stop the world);将空闲region重置到空闲列表中(concurrent);

在这里插入图片描述

最终所选区域已被收集并压缩为图中所示的深蓝色区域和深绿色区域:

在这里插入图片描述

4 拷贝存活对象Evacuation

关于G1相关概念请参考【JVM】—深入理解G1回收器——概念详解

Evacuation阶段是全暂停的。它负责把一部分region里的活对象拷贝到空region里去,然后回收原本的region的空间。Evacuation阶段可以自由选择任意多个region来独立收集构成CSet),考RSet实现。这是regional garbage collector的特征。

G1有两种GC模式:Young GC和Mixed GC,Young GC和Mixed GC都是STW。

  • Young GC:选定所有年轻代region添加到CSet中。通过控制年轻代region的个数来,即年轻代内存的大小,来控制young GC的时间开销。
  • Mixed GC:选定所有年轻代region,外加根据global concurrent marking统计结果得出的收益高的若干老年代region添加到CSet中。在用户指定开销返回内尽可能选择收益高的老年代region。

在选定CSet后,Evacuation其实就跟ParallelScavenge的Young GC的算法类似,采用并行copying(或者叫scavenging)算法把CSet里每个region里的活对象拷贝到新的region里,整个过程完全暂停。从这个意义上说,G1的Evacuation跟传统的标记整理算法的compaction完全不同:前者会自己从根集合遍历对象图来判定对象的生死,不需要依赖全局并发标记的结果(有就用没有拉倒);而后者则依赖于之前的mark阶段对对象生死的判定。

CSet的选定完全靠统计模型找处收益最高、开销不超过用户指定的上限的若干region。由于每个region都有RSet覆盖,要单独evacuate任意一个或多个region都没问题。

可以看到young gen region总是在CSet内。因此分代式G1不维护从young gen region出发的引用涉及的RSet更新。Mixed GC不是Full GC,因为Mixed GC只收集部分老年代region,如果在Mixed GC期间出现老年代被占用完的情况,JVM会采用Serial Old(Full GC)收集器来收集整个Heap。

老年代region回收完全依赖于Mixed GC。G1的正常工作流程就是在Young GC和Mixed GC之间视情况切换,背后定期做global concurrent marking(全局并发标记),global concurrent marking(全局并发标记)主要是为Mixed GC提供标记服务,而不是一次GC过程中的必须环节。G1的所有concurrent动作都在global concurrent marking里。Young GC和Mixed GC都是完全暂停的。

Young GC 和Mixed GC都是STW,为什么G1还可以被称为低延迟的GC实现呢?

可以看到在这么多步骤里,G1只有两件事是并发执行的:(1) 全局并发标记;(2) logging write barrier的部分处理。而“拷贝对象”(evacuation)这个很耗时的动作却不是并发而是完全暂停的。那G1为何还可以叫做低延迟的GC实现呢?

重点就在于G1虽然会mark整个堆,但并不evacuate所有有活对象的region;通过只选择收益高的少量region来evacuate,这种暂停的开销就可以(在一定范围内)可控。每次evacuate的暂停时间应该跟一般GC的young GC类似。所以G1把自己标榜为“软实时”(soft real-time)的GC。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/454634.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于PERL语言的MS中CASTEP模块批量提交计算脚本

在现代科学研究中,高效的计算工具对于推动科研进步具有不可估量的价值。为了满足广大科研工作者在材料科学、化学、物理等领域日益增长的计算需求,我们特别推出了一款基于Perl语言的MS CASTEP模块批量提交计算脚本。 一、批量提交,高效处理 …

Vulnhub打靶-Empire-LupinOne

基本信息 靶机下载:https://download.vulnhub.com/empire/01-Empire-Lupin-One.zip 攻击机器:192.168.20.128(Windows操作系统)& 192.168.20.138(kali) 提示信息: 这个盒子被创建为中等…

RNN,LSTM,GRU的区别和联系? RNN的梯度消失问题?如何解决?

RNN,LSTM,GRU的区别和联系? RNN(Recurrent Neural Network)、LSTM(Long Short-Term Memory)和GRU(Gated Recurrent Unit)都是用于处理序列数据的神经网络模型,它们之间…

《黑神话悟空》各章节boss顺序汇总

第一章BOSS顺序: 1、牯护院:犀牛精,位于苍狼岭娟,击败后能获得定身术。 2、广智:火刀狼, 位于观音禅院,击败后获得广智变身,记得敲钟。 3、蓝皮幽魂:蓝皮大头&#xff0…

间充质干细胞疗法迎来快速发展:国内新药申请超93项,全球临床试验超1300项

间充质干细胞(Mesenchymal Stem Cells, MSCs)独一无二的特性和机制构建了非凡的治疗前景和成药空间。截止到2024年10月18日,临床试验注册库clinicaltrials.gov网站上有关“Mesenchymal Stem Cell”的项目有1303项。在国家药品监督管理局药品审…

Active Directory(活动目录)密码审核工具

什么是Active Directory密码审核 Active Directory密码审核涉及监控用户密码的状态及其身份验证尝试,以便 IT 管理员收到有关弱 Active Directory密码或任何异常身份验证行为的通知。 Active Directory密码审核可帮助管理员评估用户密码的强度并采取必要措施来加强…

Composio:AI 开发利器,集成 100+ 工具,简化智能体构建

❤️ 如果你也关注大模型与 AI 的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的 AI 应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦! 微信公众号|搜一搜&…

SimpleLive 1.7.3 | TV+手机,聚合抖B虎鱼四大直播

SimpleLive是一款聚合多个直播平台的应用程序,内置虎牙、斗鱼、哔哩哔哩及抖音直播,提供无广告体验,支持弹幕显示调整、夜间模式切换等功能,无需登录即可关注不同平台主播并查看其直播状态。下载安装APK后打开应用,选择…

Web Service

目录 1、概览2、SOA架构2.1 Web Service的基础协议2.2 Web Service协议栈 3 Web Service的分类3.1 应用领域3.2 服务器类型 4 厂商支持4.1 Java EE4.2 .NET4.3 WebSphere 5 其他5.1 微服务与 Web Service5.1.1 微服务与 Web 服务之间的区别5.1.2 微服务、 Web 服务的最佳实践 5…

laravel 查询数据库

数据库准备 插入 三行 不同的数据 自行搭建 laravel 工程 参考 工程创建点击此处 laravel 配置 数据库信息 DB_CONNECTIONmysql #连接什么数据库 DB_HOST127.0.0.1 # 连接 哪个电脑的 ip (决定 电脑 本机) DB_PORT3306 # 端口 DB_DATABASEyanyu…

FloodFill 算法(DFS)

文章目录 FloodFill 算法(DFS)图像渲染岛屿数量岛屿的最大面积被围绕的区域太平洋大西洋水流问题扫雷游戏衣橱整理 FloodFill 算法(DFS) 漫水填充(Flood Fi)算法是一种图像处理算法,在计算机图形学和计算机视觉中被广泛…

超详细的 Stable Diffusion Webui入门教程(二)基础操作

前言 工欲善其事,必先利其器!今天我们聊聊 Stable Diffusion WebUI 的基础操作以及各个参数都代表了什么。 所有的AI设计工具,安装包、模型和插件,都已经整理好了,👇获取~ 一、大模型的切换 在 Stable D…

【从零开始的LeetCode-算法】3185. 构成整天的下标对数目 II

给你一个整数数组 hours&#xff0c;表示以 小时 为单位的时间&#xff0c;返回一个整数&#xff0c;表示满足 i < j 且 hours[i] hours[j] 构成 整天 的下标对 i, j 的数目。 整天 定义为时间持续时间是 24 小时的 整数倍 。 例如&#xff0c;1 天是 24 小时&#xff0c…

[Vue3核心语法] ref、reactive响应式数据

定义: ref用来定义&#xff1a;基本类型数据、对象类型数据&#xff1b; reactive用来定义&#xff1a;对象类型数据。 使用原则: 若需要一个基本类型的响应式数据&#xff0c;必须使用ref。 若需要一个响应式对象&#xff0c;层级不深&#xff0c;ref、reactive都可以。 …

项目管理这些问题,你是不是忍了很久?

项目管理中常见的问题&#xff0c;你是不是早就感到无奈了&#xff1f;项目进度滞后、成本超支、团队协作不畅、任务分配模糊、资源分配不合理……这些问题常常让人感到力不从心。 无论是关键节点的拖延&#xff0c;还是多部门间的沟通障碍&#xff0c;最终都会拖慢项目进展&a…

京东大模型革命电商搜推技术:挑战、实践与未来趋势

大模型对搜推技术产生了深远的影响&#xff0c;极大地推动了搜推技术的演进趋势&#xff0c;使得搜推更加的智能化和个性化&#xff0c;然而在搜推中引入大模型时同样面临一系列的挑战&#xff0c;例如商品知识的幻觉&#xff0c;复杂查询的理解&#xff0c;个性化商品推荐&…

酒店预订订房小程序源码系统 多酒店入驻+打造类似美团的酒店模式 带完整的安装代码包以及搭建部署教程

系统概述 随着移动互联网的普及&#xff0c;小程序因其轻量级、无需下载安装、即用即走的特点&#xff0c;迅速成为各行业的标配。对于酒店预订行业而言&#xff0c;小程序不仅能够有效提升用户体验&#xff0c;还能降低运营成本&#xff0c;提高转化率。本源码系统正是基于这…

js实现数组中数据有则删除无则添加-[‘12123‘,‘432233‘...]

可以使用indexOf方法来判断数组中是否存在某个元素&#xff0c;如果存在则使用splice方法删除该元素&#xff0c;如果不存在则使用push方法添加该元素。 下面是具体的代码实现&#xff1a; function addOrRemove(arr, item) {const index arr.indexOf(item);if (index -1) {…

Dockerfile和docker-compose详解

Dockerfile和docker-compose详解 文章目录 Dockerfile和docker-compose详解一、Dockerfile1. Dockerfile简介2. 构建镜像3. Dockerfile命令&#xff08;1&#xff09;FROM&#xff08;2&#xff09;WORKDIR&#xff08;3&#xff09;RUN&#xff08;4&#xff09;COPY&#xff…

MATLAB智能算法 - Immunity Algorithm免疫算法

Immunity Algorithm免疫算法 智能算法是路线规划、深度学习等等一系列领域所使用的优化算法&#xff0c;是算法进阶之路的必备之路。 前言&#xff1a;本文主要围绕解决TSP旅行商问题展开&#xff0c;对于机器人的路线规划以及非线性方程求解的问题等解决方案 对于一些其他智能…