JVM(Java Virtual Machine)G1收集器篇

前言

本文参考《深入理解Java虚拟机》,本文主要介绍G1收集器的收集思想和具体过程(填上一篇文章留下的坑)

本系列其他文章链接:
JVM(Java Virtual Machine)内存模型篇
JVM(Java Virtual Machine)垃圾收集算法篇
JVM(Java Virtual Machine)垃圾收集器篇

G1(Garbage First)收集器

G1是一款主要面向服务端应用的垃圾收集器。它诞生的目的就是取代CMS的位置,或者说是“代替者”和“继承人”。开发者在设计之初,就是希望能建立一个“停顿时间模型”的收集器。

停顿时间模型:能够支持指定在一个长度为x毫秒的时间片段内,消耗的垃圾收集时间大概率不超过x毫秒这样的目标

所以G1就在这样的希望下,被创造出来了

G1的“化整为零”

在G1收集器中,它将连续的堆划分为大小相等的独立的区域(Region),每个Region都可以根据需要,扮演新生代的Eden、Survivor空间或者老年代空间,这些空间大小都是动态变化的,不再和以前的收集器一样限定分区空间大小。

除此之外,Region还有一类Humongous区域,这部分区域是专门为大对象准备的。

大对象判定:每个对象超过Region容量一半以上就算大对象

所以基于以上分区下,G1的垃圾收集就没有Minor GC、Major GC、Full GC 这种概念了,它采用的是Mixed GC,也就是说,G1可以对堆中的任何部分来组成回收集合(Collection Set),通俗就是“打包一起丢”,它的衡量标准是:哪块内存中存放的垃圾数量最多,回收价值越大,就在规定的时间内优先处理这些垃圾

因此为了知道那个区域最优价值,所以也需要维护一个优先列表,每次GC,从列表中取最优的,这也是为什么叫“Garbage First”的原因。

基于以上,G1中,堆的内存布局可能是这样的:
在这里插入图片描述

G1存在的关键问题已经如何解决的

  • :Region里面存在跨Region引用对象如何解决?

答:
使用记忆集,但这个记忆集会比其他垃圾器的记忆集更为复杂,G1 至少要花费相当于Java堆容量的10%~20%来对这个记忆集进行维护工作。 每个Region的记忆集不就记录下当前Region指向的其他Region的地址,而且还有别人指向自己的并标记这些指针分别在哪些卡页范围之内,也就是 “我指向谁,谁指向我”的记忆集

补充内容:记忆集可以避免垃圾扫描时进行全堆扫描节约时间

  • :并发标记阶段如何保证收集线程与用户线程互不干扰地运行?

答:
在回答这个问题前,我们需要了解两个概念:“增量更新”和“原始快照”

  • 增量更新:在并发标记过程中,用户线程新对象在GC Root上的某个Node相关联时,我们将这个新来的引用记录下来,并发标记结束后,重新对Node进行扫描,查看是否任然是关联关系。
  • 原始快照(SATB算法):对当前堆的关联关系进行快照保存,不管中途是新增还是删除,并发标记过程中,根据快照的关联关系进行扫描

在了解上面两个概念后,就可以回答这个问题了,G1使用的是原始快照,当然具体实现上肯定不止这么简单!!!


此外,G1为每个Region设计了两个名为:TAMS(Top at Mark Start)的指针,把Region中的一部分空间划分出来用于并发回收过程中的新对象分配,并发回收时新分配的对象地址都必须要在这两个指针位置上。G1收集器默认这个地址上的对象是被隐式标记过了,即默认他们是存活的。

  • :怎样建立起可靠的停顿预测模型?

答:
G1 收集器的停顿预测模型是以“衰减均值”为理论基础来实现的,在垃圾收集过程,G1收集器会记录每个Region的一些数据,例如:记忆集里面的脏数据、回收耗时等数据,进行计算,最终根据这个值来确认回收价值,在规定时间内,每次回收价值最大的。(详细过程,读者可以自行了解,这里不做过多赘述OWO)

G1的垃圾收集过程

G1的垃圾收集大致分为下面四个步骤:

  • 初始标记(Initial Marking)
    • 需要停顿线程,但是耗时非常短。
    • 仅标记GC Roots能直接关联到的对象,比修改TAMS的值,让下一阶段用户线程并发能正确在Region中分配对象
  • 并发标记(Concurrent Marking)
    • 与用户线程并发
    • 从GC Roots中递归查找可以回收的对象,耗时较长(对象数量决定), 扫描结束后,还需要重新处理SATB记录下的并发时有引用变动的对象
  • 最终标记(Final Marking)
    • 用户线程短暂停顿
    • 用于处理并发阶段结束后遗留下来的最后那少量的SATB记录
  • 筛选回收(Live Data Counting and Evacuation):
    • 暂停用户线程,并发回收
    • 对Region中的价值进行排序,然后打包多块Region收集,把存活的Region复制到另一个Region中,然后情况当前Region。这个过程设计对象移动所以需要暂停用户线程。
    • 堆内回收示意:在这里插入图片描述

到这一步其实也能看出来G1在一定程度上,不仅仅为了低延迟,还想方设法保证吞吐量,不然再最后回收阶段,他任然可以并发用户线程(ZGC是如此),下图是G1收集器运行过程图:
在这里插入图片描述


END
希望能对你有帮助

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

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

相关文章

新恶意软件使用 MSIX 软件包来感染 Windows

人们发现,一种新的网络攻击活动正在使用 MSIX(一种 Windows 应用程序打包格式)来感染 Windows PC,并通过将隐秘的恶意软件加载程序放入受害者的 PC 中来逃避检测。 Elastic Security Labs 的研究人员发现,开发人员通常…

RTE(Runtime Environment)

RTE(Runtime Environment)是一个运行时环境,在这个环境里,你可以实现的功能是: 作为一个缓冲buffer给应用层和BSW层的接口(例如COM)用来存储数据,也就是说定义一个全局变量供上层和下…

【C++的OpenCV】第十四课-OpenCV基础强化(二):访问单通道Mat中的值之at()、ptr()、iscontinuous()

🎉🎉🎉 欢 迎 各 位 来 到 小 白 p i a o 的 学 习 空 间 ! \color{red}{欢迎各位来到小白piao的学习空间!} 欢迎各位来到小白piao的学习空间!🎉🎉🎉 💖&…

node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)

文章目录 ⭐前言⭐ 环境准备⭐ 实现过程⭐ mysql 配置⭐路由前的准备⭐账号注册生成token⭐账号登录生成token⭐token登录 ⭐ 自测过程截图⭐总结⭐结束 ⭐前言 大家好,我是yma16,本文分享关于node实战——后端koa项目配置jwt实现登录注册(n…

springboot配置https

SSL : secure socket layer 是一种加密协议,SSL主要用于保护数据在 客户端和服务器之间的传输,,防止未经授权的访问和窃取敏感信息 在腾讯云申请ssl证书 申请了之后在我的域名中,,解析 解析了之后&…

Django 尝试SSE报错 AssertionError: Hop-by-hop headers not allowed 的分析

情况描述 近期计划测试一下django对日志打印的支持,一般都是用websocket的方式,想测试一下SSE (Server-sent events)的服务端推送,发现过程中存在报错: Traceback (most recent call last):File "D:\Software\Anaconda3\li…

API Testing v0.0.14 新增 gRPC, tRPC 协议的支持

api-testing 本次版本发布中的内容中,包含了两位高校同学的 contribution,其中屈晗煜在GitLink编程夏令营(GLCC)活动期间非常给力地增加了gRPC 协议的支持。 atest 版本发布 v0.0.14 atest 是一款用 Golang 编写的、开源的接口测试…

CSRF 篇

一、CSRF 漏洞: 1、漏洞概述: (1)一般情景: 利用已认证用户的身份执行未经用户授权的操作。攻击者试图欺骗用户在其不知情的情况下执行某些操作,通常是在受害者已经登录到特定网站的情况下。 &#xff0…

线程是如何创建的

线程不是一个完全由内核实现的机制,它是由内核态和用户态合作完成的。pthread_create 不是一个系统调用,是 Glibc 库的一个函数,所以我们还要去 Glibc 里面去找线索。 首先处理的是线程的属性参数。例如前面写程序的时候,我们设置…

国家数据局正式揭牌,数据专业融合型人才迎来发展良机

📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于恒川的日常汇报系列,大家有兴趣的可以看一看 📘相关专栏C语言初阶、C…

今天面了个00后测试员,让我见识到了内卷届的天花板

深耕IT行业多年,我们发现,对于一个程序员而言,能去到一线互联网公司,会给我们以后的发展带来多大的影响。 很多人想说,这个我也知道,但是进大厂实在是太难了,简历投出去基本石沉大海&#xff0…

MyBatis的增删改查

2023.10.29 本章学习MyBatis的基本crud操作。 insert java程序如下: ①使用map集合传参 Testpublic void testInsertCar(){SqlSession sqlSession SqlSessionUtil.openSession();//先将数据放到Map集合中,在sql语句中使用 #{map集合的key} 来完成传…

【c++|opencv】一、基础操作---1.图像读取

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 有关c操作opencv记录 1. 正文 1.1 图像读取、显示、保存 // 读取、显示、保存图像#include <opencv2/opencv.hpp> #include <iostream>us…

除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂…

Xilinx 7 系列 1.8V LVDS 和 2.5V LVDS 信号之间的 LVDS 兼容性

如果通过LVDS进行接口&#xff0c;可以按照以程图中的步骤操作&#xff0c;以确保满足正确使用LVDS的所有要求。 40191 - 7 系列 - 1.8V LVDS 和 2.5V LVDS 信号之间的 LVDS 兼容性 与LVDS兼容驱动器和接收器连接时&#xff0c;7系列LVDS和LVDS_25输入和输出应该不存在兼容性问…

合肥中科深谷嵌入式项目实战——人工智能与机械臂(四)

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 作者&#xff1a;爱吃饼干的小白鼠。Python领域优质创作者&#xff0c;2022年度博客新星top100入围&#xff0c;荣获多家平台专家称号。…

3.6每日一题(线性方程求通解)

1、判断类型选择方法&#xff1a;发现以y为未知函数&#xff0c;以x为自变量&#xff0c;不符合我们学过的类型 2、此时有两种方法&#xff1a; &#xff08;1&#xff09;x 与 y 对调&#xff0c;此时 x 为未知函数&#xff0c;y 为自变量 &#xff08;2&#xff09;变量代换…

【Linux精讲系列】——yum软件包管理

​作者主页 &#x1f4da;lovewold少个r博客主页 ⚠️本文重点&#xff1a;Linux系统软件包管理工具yum讲解 &#x1f604;每日一言&#xff1a;踏向彼岸的每一步&#xff0c;都是到达彼岸本身。 目录 前言 Linux系统下的软件下载方式 yum 查看软件包 如何安装软件 如何卸…

Apollo上机实践:一次对自动驾驶技术的亲身体验

上机实践 概述自动驾驶通信分布式系统开发模式开发工具 自动驾驶感知传感器特性感知流程及算法部署感知模型 自动驾驶决策规划决策规划流程和算法使用 Dreamview 进行控制在环的规划调试开发规划场景和算法 福利活动 主页传送门&#xff1a;&#x1f4c0; 传送 概述 Apollo 是…

网络协议--TCP的交互数据流

19.1 引言 前一章我们介绍了TCP连接的建立与释放&#xff0c;现在来介绍使用TCP进行数据传输的有关问题。 一些有关TCP通信量的研究如[Caceres et al. 1991]发现&#xff0c;如果按照分组数量计算&#xff0c;约有一半的TCP报文段包含成块数据&#xff08;如FTP、电子邮件和U…