JVM(Java Virtual Machine)G1收集器篇

news2024/7/2 3:53:01

前言

本文参考《深入理解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.coloradmin.cn/o/1137054.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

绿米Aqara S1【妙控开关 S1E】的破解方法---续篇

概述 上接第一篇《绿米Aqara S1【妙控开关 S1E】的破解方法》。 链接地址如下: 绿米Aqara S1【妙控开关 S1E】的破解方法-CSDN博客 上篇主要讲述了,绿米S1E这款硬件的基本组成及TTL线的线序,并获取到了对应的串口打印信息。 此篇重点讲解,如何进入其系统,并开启访问权…

【经验分享】在WSL中使用USB设备

具体步骤: 首先在windows中安装 USBIP 工具,在GitHub上下载安装包并根据README文档的说明进行操作: 下载链接:https://github.com/dorssel/usbipd-win/releases 同时在 WSL Linux 端也需要安装编译内核所需的库和工具&#xff0c…

【微信小程序】实现投票功能(附源码)

一、Vant Weapp介绍 Vant Weapp 是一个基于微信小程序的组件库,它提供了丰富的 UI 组件和交互功能,能够帮助开发者快速构建出现代化的小程序应用。Vant Weapp 的设计理念注重简洁、易用和高效,同时提供灵活的定制化选项,以满足开发…

电动汽车租赁平台【EV Mobility】申请875万美元纳斯达克IPO上市

来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,总部位于美国的电动汽车租赁平台【EV Mobility】近期已向美国证券交易委员会(SEC)提交招股书,申请在纳斯达克IPO上市,股票代码为(EVMO) &#xff0c…

举个栗子!Quick BI 技巧(3):创建趋势分析表

上一期举个栗子为数据粉们分享了如何简单几步创建柱线图,有一些数据想了解如何在 Quick BI 中制作趋势分析表。 趋势分析表由趋势分析图和趋势分析明细表组成,可以通过趋势分析图查看指标的宏观趋势,通过趋势分析表查看指标详情,…

macOS Sonoma 14.1正式版(23B74)发布(可下载黑白苹果镜像)

系统介绍 黑果魏叔苹果今天为 macOS Sonoma 推出了 14.1 版本更新,魏叔发现,本更新主要改善了 Apple Music 界面,设置中新增保修状态,并修复了多项错误内容。 根据苹果的新说明,这次的 Mac 更新不仅提供了一系列的改善…

博睿数据亮相GOPS全球运维大会上海站!

10月26日,博睿数据携核心产品新一代一体化智能可观测平台 Bonree ONE 亮相第二十一届 GOPS 全球运维大会上海站,展示博睿数据在智能运维领域的科技实力与创新成果。同时,博睿数据AIOps首席专家兼产品总监贺安辉在AIOps最佳实践及解决方案专场…

User CSS 在性能优化方面的实践

目录 前言 1. 减少重绘和回流 1.1 用法 1.2 代码示例 1.3 理解 2. 使用CSS精灵 2.1 用法 2.2 代码示例 2.3 理解 3. 压缩CSS文件 3.1 用法 3.2 代码示例 3.3 理解 4. 使用媒体查询进行响应式设计 4.1 用法 4.2 代码示例 4.3 理解 5. 使用CSS预处理器和构建工…

物联网AI MicroPython传感器学习 之 MDL0025心率传感器

学物联网,来万物简单IoT物联网!! 一、产品简介 PulseSensor(MDL0025) 是一款用于脉搏心率测量的光电反射式模拟传感器。将其佩戴于手指或耳垂等处,通过导线连接可将采集到的模拟信号传输给HaaS开发版用来转…

[java进阶]——HashMap的底层实现原理和源码分析,另附几个高频面试题

🌈键盘敲烂,年薪30万🌈 目录 一、底层数据结构 二、底层原理及源码分析 2.1 继承关系 2.2 成员变量 2.3 构造方法 2.4 重要的成员方法 2.4.1 put()方法 三、高频面试题 一、底层数据结构 JDK8以后底层使用 数组链表红黑树的数据结构&am…

贝锐花生壳内网穿透推出全新功能,远程业务连接更安全

贝锐旗下内网穿透兼动态域名解析品牌花生壳目前推出了全新的“访问控制”功能,可精确设置访问权限,充分保障信息安全,满足更多用户安全远程访问内网服务的需求。 通过这一功能,可实现指定时间、IP、地区等条件下才能远程访问映射的…

【C++】继承 ⑬ ( 虚继承原理 | 虚继承解决继承二义性问题 | 二义性产生的原因分析 )

文章目录 一、虚继承原理1、虚继承解决继承二义性问题2、二义性产生的原因分析3、虚继承原理 二、代码示例 - 虚继承原理1、完整代码示例2、执行结果 一、虚继承原理 1、虚继承解决继承二义性问题 继承的二义性 : 如果 一个 子类 ( 派生类 ) 继承多个 父类 ( 基类 ) , 这些父类…

【【萌新的FPGA学习之FIFO的介绍】】

萌新的FPGA学习之FIFO的介绍 FIFO first in first out FIFO 的作用更多的是 缓冲与缓存 或者FIFO 也常被用来使用为 FIFO 本质上是由 RAM 加读写控制逻辑构成的一种先进先出的数据缓冲器,其与普通存储器 RAM 的 区别在于 FIFO 没有外部读写地址线,使用起…

接口自动化测试方案

1、引言 1.1 文档版本 版本 作者 审批 备注 V1.0 XXXX 创建测试方案文档 1.2 项目情况 项目名称 XXX 项目版本 V1.0 项目经理 XX 测试人员 XXXXX,XXX 所属部门 XX 备注 1.3 文档目的 本文档主要用于指导XXX-YY项目常用接口自动化测试…

数据隐私保护与合规性:现代企业的数据安全策略

第一章:引言 在当今数字化时代,数据已经成为企业最宝贵的资源之一。然而,伴随着大规模数据收集和处理的增加,数据隐私保护和合规性问题也日益凸显。本文将深入探讨数据隐私保护和合规性对现代企业的重要性,并提供一些…

重大突破!国内首个ASIL D认证MCU在底盘域量产上车

中国本土车规级MCU再次实现了重要突破。 近日,芯驰科技的高性能车规MCU——E3搭载在明然科技悬架控制器(CDC)批量下线,并且成功在奇瑞瑞虎9、星途瑶光等车型上正式量产,成为了国内首个应用在主动悬架的车规控制芯片。…

行业追踪,2023-10-26

自动复盘 2023-10-26 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

干货很干:5个有效引流方法,让客户找上门

如何才能把用户引流到私域?是很多老板,店主,线上创业者的卡点,今天分享5个实用方法: ✅线下导流 ✅巧用搜索 ✅同行互推 ✅社群引流 ✅内容输出 所以引流不仅需要知道方法,还需要知道底层逻辑,也…

分布式事务(Seata)——Seata分布式事务XA模式、AT模式、TCC模式的介绍和对比 结合案例分析AT模式和XA模式【源码】

前言 事务(TRANSACTION)是一个不可分割的逻辑单元,包含了一组数据库操作命令,并且把所有的命令作为一个整体向系统提交,要么都执行、要么都不执行。 事务作为系统中必须考虑的问题,无论是在单体项目还是在分布式项目中都需要进行…

从零开始:开发知识付费小程序的入门指南

当下,知识付费小程序成为了一个独具潜力的领域。本篇文章将为您提供一份从零开始的知识付费小程序开发入门指南,让您能够进入这个领域并开始赚取您的专业知识。 第一步:什么是知识付费小程序? 知识付费小程序是一种基于微信小程…