当前位置: 首页 > news >正文

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
希望能对你有帮助

相关文章:

JVM(Java Virtual Machine)G1收集器篇

前言 本文参考《深入理解Java虚拟机》,本文主要介绍G1收集器的收集思想和具体过程(填上一篇文章留下的坑) 本系列其他文章链接: JVM(Java Virtual Machine)内存模型篇 JVM(Java Virtual Machi…...

微信小程序设计之主体文件app-json-tabBar

一、新建一个项目 首先,下载微信小程序开发工具,具体下载方式可以参考文章《微信小程序开发者工具下载》。 然后,注册小程序账号,具体注册方法,可以参考文章《微信小程序个人账号申请和配置详细教程》。 在得到了测…...

GZ035 5G组网与运维赛题第2套

2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项(高职组) 赛题第2套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通(35分) 子任务1:5G公共网络部署与调试(15分) 子任务2:5G室内与室外站点建设(20分) 竞赛模块2--5G公共网络运维与优化(…...

如何训练Embedding Model

BGE的技术亮点: 高效预训练和大规模文本微调;在两个大规模语料集上采用了RetroMAE预训练算法,进一步增强了模型的语义表征能力;通过负采样和难负样例挖掘,增强了语义向量的判别力;借鉴Instruction Tuning的…...

springboot配置redis、Spring cache

1.Jedis库 依赖库 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.0.2</version> </dependency>使用案例&#xff1a; Testpublic void jedis(){Jedis jedis new Jedis("127…...

悟空crm安装搭建 报错[0] RedisException in Redis.php line 56问题处理办法

相信很多朋友进行安装悟空crm的时候 提示错误&#xff1a; [0] RedisException in Redis.php line 56 Connection refused 不知道怎么样处理是吧~~~ $this->options array_merge($this->options, $options);}# redis 密码$password config(cache.password);if (!empty…...

Ubuntu22.04 交叉编译阿里oss c-sdk

一、交叉编译openssl Ubuntu20.04 交叉编译openssl 1.0.1f_编译前去除 makefile 中所有的"-m64"字段_qq76211822的博客-CSDN博客文章浏览阅读319次。Ubuntu20.04 交叉编译openssl_编译前去除 makefile 中所有的"-m64"字段https://blog.csdn.net/sz7621182…...

arch linux 安装 vsftpd 配置虚拟用户

后面操作会直接基于 yay 操作 自行查找如何安装 yay 公司经常会用到 ftp 服务 不想用 apache 的 ftp server 所以自己在小机器上撞了 arch linux 用来安装软件 跑程序等。 1. 安装 vsftpd yay vsftpd --noconfirm选择 1 安装 输入密码 2. 安装 pam_pwdfile 安装 pam_pwdf…...

Django的查询所有,根据用户名查询,增加用户操作

1.路由 from meiduo_admin.user.user_views import UsersViewurlpatterns [# 用户操作路由path(users/, UsersView.as_view()), ]2. 序列化器 from rest_framework import serializersfrom meiduo_admin.models import Userclass UsersSerialize(serializers.ModelSerialize…...

【adb】adb相关命令行及adb传输文件权限问题 remote couldn‘t create file: Read-only file system

adb传输文件权限问题 今天用adb push的时候&#xff0c;报错说并非root权限 remote couldnt create file: Read-only file system 以下是adb相关命令一、非root权限解决方案 1️⃣运行以下命令行 adb root adb remount2️⃣如果还报错&#xff0c;则运行以下命令行 adb disab…...

基于物联网云平台的分布式光伏监控系统的设计与实现

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;针对国内光伏发电监控系统的研究现状&#xff0c;文中提出了基于云平台的光伏发电监控体系。构建基于B/S架构的数据实时采集与推送&#xff0c;以SSH(strutsspringhibernate)作为Web开发框架&#xff0c;开发基…...

初识Node.js开发

一、Node.js是什么 1.node.js是什么 官方对Node.js的定义&#xff1a; Node.js是一个基于V8 JavaScript引擎的JavaScript运行时环境。 也就是说Node.js基于V8引擎来执行JavaScript的代码&#xff0c;但是不仅仅只有V8引擎&#xff1a; 前面我们知道V8可以嵌入到任何C 应用…...

【Python入门教程】基于OpenCV视频分解成图片+图片组合成视频(视频抽帧组帧)

在人工智能爆火的今天&#xff0c;深度学习被广泛应用于各个领域。深度学习的模型训练离不开大量的样本库。我之前分享过【Python爬虫】批量爬取网页的图片&制作数据集&#xff0c;今天跟大家分享一下如何使用OpenCV库对视频进行抽帧&#xff0c;从而增加样本图片的数量。正…...

微前端qiankun接入Vue和React项目

主应用&#xff1a;Vue3Webpack 1、创建主应用&#xff1a; npx vue create main-vue3-app 2、安装qiankun npx yarn add qiankun 3、项目中使用的vue、vue-router、qiankun依赖如下&#xff0c;webpack版本为5.x 4、在根目录下创建vue.config.js const { defineConfig }…...

提升技能,一触即达!全新在线题库微信小程序等你来挑战!

亲爱的同学们&#xff0c;你是否在准备各种专业认证考试时&#xff0c;感到题目繁多&#xff0c;复习困难&#xff1f;你是否在寻找一个能够提供全方位、各级别认证考试题库的在线学习平台&#xff1f; 今天&#xff0c;我们为你带来了一款全新的在线题库微信小程序——KD蝌蚪阿…...

语雀P0级故障复盘,有9个字亮了

大家好&#xff0c;我是洋子 最近语雀不是出了个号称 “载入史册” 的 P0 级事故嘛 —— 连续宕机接近8个小时无法使用&#xff0c;作为一个大厂知名产品&#xff0c;这个修复速度属实让人无法理解 故障公告原文&#xff1a;https://mp.weixin.qq.com/s/WFLLU8R4bmiqv6OGa-QMc…...

在 openresty 中使用 capnp lua 库

1. 安装必要的工具和库 apt-get install capnproto luarocksluarocks install lua-capnproto luarocks install lua-cjsonlua-cjson 库不是必须的&#xff0c;是由于后面的演示程序要使用&#xff0c;就一起装上了。 可以看下库的安装位置&#xff1a; root350983744ebf:~# …...

私藏小技巧:让微信朋友圈营销方便化的小窍门!

微信&#xff0c;这个拥有十亿用户的社交软件&#xff0c;已经成为生活中不可或缺的一部分。 而朋友圈&#xff0c;这个微信的基础功能&#xff0c;是聚宝盆&#xff0c;也是一切流量的尽头。 现在公域&#xff0b;私域的流量增长变现体系很火。朋友圈是一切公域流量的尽头&a…...

Centos使用tomcat部署jenkins

jenkins的最新版本已经不在支持jdk8&#xff0c;支持的jdk环境如下&#xff1a; 安装jdk环境 yum -y install java-11-openjdk.x86_64 java-11-openjdk-devel.x86_64安装tomcat tomcat官网 cd /optwget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.82/bin/apache-tomcat…...

uni-app打包apk实现自动更新

一、直接复制粘贴就可用(豪横) app.vue文件里写 //app.vue里写 <script>export default {onShow: function() {console.log(App Show)},onHide: function() {console.log(App Hide)},onLaunch: function() {let appVersion uni.getSystemInfo({success: function(e) {ap…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...

计算机系统结构复习-名词解释2

1.定向&#xff1a;在某条指令产生计算结果之前&#xff0c;其他指令并不真正立即需要该计算结果&#xff0c;如果能够将该计算结果从其产生的地方直接送到其他指令中需要它的地方&#xff0c;那么就可以避免停顿。 2.多级存储层次&#xff1a;由若干个采用不同实现技术的存储…...

【多线程初阶】单例模式 指令重排序问题

文章目录 1.单例模式1)饿汉模式2)懒汉模式①.单线程版本②.多线程版本 2.分析单例模式里的线程安全问题1)饿汉模式2)懒汉模式懒汉模式是如何出现线程安全问题的 3.解决问题进一步优化加锁导致的执行效率优化预防内存可见性问题 4.解决指令重排序问题 1.单例模式 单例模式确保某…...

联邦学习带宽资源分配

带宽资源分配是指在网络中如何合理分配有限的带宽资源&#xff0c;以满足各个通信任务和用户的需求&#xff0c;尤其是在多用户共享带宽的情况下&#xff0c;如何确保各个设备或用户的通信需求得到高效且公平的满足。带宽是网络中的一个重要资源&#xff0c;通常指的是单位时间…...

Linux信号保存与处理机制详解

Linux信号的保存与处理涉及多个关键机制&#xff0c;以下是详细的总结&#xff1a; 1. 信号的保存 进程描述符&#xff08;task_struct&#xff09;&#xff1a;每个进程的PCB中包含信号相关信息。 pending信号集&#xff1a;记录已到达但未处理的信号&#xff08;未决信号&a…...

Java求职者面试:微服务技术与源码原理深度解析

Java求职者面试&#xff1a;微服务技术与源码原理深度解析 第一轮&#xff1a;基础概念问题 1. 请解释什么是微服务架构&#xff0c;并说明其优势和挑战。 微服务架构是一种将单体应用拆分为多个小型、独立的服务的软件开发方法。每个服务都运行在自己的进程中&#xff0c;并…...