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

G1 GC基本逻辑


1  MixedGC基本过程
在G1GC中,有两种主要的垃圾回收过程:Young GC和Mixed GC。这两者都是为了回收堆内存中的垃圾对象,但是他们关注的区域和工作方式有所不同。

Young GC:

Young GC主要负责回收Young Generation(包括Eden区和Survivor区)。大多数新创建的对象都首先在Eden区分配,在一段时间后,如果这些对象仍然存活,它们将被移动到Survivor区或Old区。Young GC通常会频繁发生,因为大多数对象的生命周期都很短,很快就会变成垃圾可以被回收。

Mixed GC:

与Young GC不同,Mixed GC不仅回收Young Generation,还会回收部分Old Generation。Mixed GC发生的条件是在并发标记周期结束后,也就是说,它会在完成全堆的并发标记之后进行。在Mixed GC中,G1GC会选择一些可以回收的老年代区域进行清理,这样可以在不进行Full GC的情况下,尽可能地清理掉一些长时间存活的垃圾对象

在G1GC中,实际上只有YoungGC. 或者说MixedGc是跟随YoungGC
1 Mixed GC触发条件:

1)如果堆内存的使用率超过了一个阈值(默认是45%,可以通过-XX:InitiatingHeapOccupancyPercent参数进行调整),那么将会启动一个并发周期,而Mixed GC则在并发周期结束后开始。
2)老年代的区域已经满了。G1GC会尽可能地避免Full GC,所以当老年代的区域已经满了,并且并发标记已经完成,G1GC会触发Mixed GC以回收老年代的部分区域
   老年代的使用率达到 -XX:G1OldCSetRegionThresholdPercent 参数设置的阈值,G1 GC 将会尽管不满足 G1HeapWastePercent 的要求,也会强制执行 Mixed GC,以防止老年代填满导致 Full GC


MixedGC阶段:
1)初始标记阶段
这个过程需要进入Stop the World的,仅仅只是标记一下GC Roots直接能引用的对象,这个过程速度是很快的。如下图,先停止系统程序的运行,然后对各个线程栈内存中的局部变量代表的GC Roots,以及方法区中的类静态变量代表的GC Roots,进行扫描,标记出来他们直接引用的那些对象
 
2)并发标记阶段
这个阶段会允许系统程序的运行,同时进行GC Roots追踪,从GC Roots开始追踪所有的存活对象,并对这个过程对象的变化做记录,比如哪些对象失去了引用,哪些对象是新建的。如下图所示。(这个阶段也是很耗时的,要追踪全部存活的对象,但跟系统并发运行,影响不大)

3)最终标记阶段
这个阶段会进入Stop the World,系统程序是禁止运行的,但是会根据并发标记阶段记录的那些对象修改,最终标记一下有哪些存活对象,有哪些是垃圾对象。

4)混合回收阶段

   计算存活对象数量:在并发标记阶段,垃圾收集器会遍历对象图并标记存活对象。这个过程可以帮助G1GC了解每个区域的存活对象数量。
   计算回收收益:根据每个区域的存活对象数量,G1GC会计算回收收益,即回收某个区域可以释放多少空间。
   选择回收集合:在计算完回收收益后,G1GC会根据预设的暂停时间目标(例如通过-XX:MaxGCPauseMillis参数设置)来选择哪些区域应该被包含在回收集合中。这个过程中,G1GC会优先选择回收收益较高的区域。

   这个阶段G1允许多次执行混合回收,也就是说先停止系统工作,执行回收,恢复系统运行,再停止系统运行,再回收,再恢复…这么一个流程。每次回收的间隔是由G1自己控制的,回收执行次数可以通过参数-XX:G1MixedGCCountTarget来设置,这个参数默认回收次数是8次,同时有一个参数-XX:G1HeapWastePercent,默认值是整个堆大小5%,就是说当前回收集合内即将空出来的区域大于整个堆的5%,就会立即停止混合回收了。正常默认回收次数是8次,但是可能到了4次,发现空闲Region大于整个堆的5%,就不会再进行后续回收了。
   G1HeapWastePercent参数(默认5%),控制了回收集合内总的region的内存大小,
         设置太大,
              则经过可能最多8次后还是达不到条件这个阈值。这可能会导致垃圾回收的暂停时间变长,对应用程序的响应时间产生影响。
              同时,如果 G1 GC 将这种回收效益不高的 region 也加入到回收集合(CSet)中,虽然能回收一些垃圾,但大部分空间仍然被活动对象占据,该 region 的空间利用率并未显著提高。
                   而实际上这些 region 的可回收空间并不多,这就造成了空间的浪费。也导致额外的 CPU 时间被用于回收这些 region
              如果内存使用效率较低,可能间接导致内存使用率较快达到 IHOP 阈值  InitiatingHeapOccupancyPercent,从而导致频繁触发并发标记。
         设置太小,
               导致mixed gc 很快就结束。进而导致很多需要回收的region得不到回收,也会影响内存里利用率。能使堆内存使用率更容易达到 -XX:InitiatingHeapOccupancyPercent(IHOP)阈值,从而触发更频繁的并发标记。
                如果堆空间使用率持续上升,可能会触发 Full GC,从而导致更长的垃圾收集暂停时间。
                
                
   如果发现老年代中可回收的对象不足以满足预设的暂停时间目标(由 -XX:MaxGCPauseMillis 参数设置):
   G1 GC 可能会提前结束 Mixed GC 状态,避免不必要的工作,因为继续执行 Mixed GC 可能无法释放足够的空间,却会消耗更多的 CPU 时间。
   
        a)通常是指老年代中可以被回收并释放的对象数量不足,也就是说,老年代中的大部分对象都还被程序所使用,无法被回收。
        b)也可能是短寿命的对象,这些对象在年轻代就被回收了,而长寿命的对象(通常会被分配到老年代)相对较少。 

  当老年代中可回收的对象超过预设的暂停时间,G1 GC 会提前结束 Mixed GC,避免回收时间过长,以尽量满足预设的暂停时间目标。
  但是,如果经常发生, 这可能导致老年代中未回收的对象增加,从而降低堆内存的使用效率。
  如果经常出现这种情况,可能需要调整 G1 GC 的配置参数或优化应用代码以减少老年代中的可回收对象。例如,可以增加-XX:G1OldCSetRegionThresholdPercent和-XX:G1HeapWastePercent的值,以允许 G1 GC 在 Mixed GC 阶段回收更多的老年代 Region,或者优化应用代码以减少长寿命对象的生成。
 

对于已经被加入到 Collection Set (CSet) 中的 region,无论它们是年轻代的还是老年代的,G1 GC 都会在当前的 GC 周期中进行回收。    如果没有可回收对象,则直接转YoungGC.


2     G1GC 新生代是动态的:
-XX:G1NewSizePercent和-XX:G1MaxNewSizePercent,分别为新生代比例的设定数值的下限和上限,默认值分别为5%和60%。G1会根据实际的GC情况(主要是暂停时间)来动态的调整新生代的大小,主要是调整Eden Region的个数。

以下是 G1 GC 动态调整新生代大小的几个重要因素:

暂停时间目标:G1 GC 通过 -XX:MaxGCPauseMillis 参数设置暂停时间目标。为了尽量满足这个目标,G1 GC 可以根据前几次垃圾收集的数据,动态地调整新生代的大小,以影响下一次垃圾收集的暂停时间。

应用程序行为:G1 GC 会根据应用程序的行为,如对象分配速率和对象存活率,动态地调整新生代的大小。对于分配密集型的应用,G1 GC 可能会增大新生代的大小以容纳更多的对象。对于对象存活率高的应用,G1 GC 可能会减小新生代的大小以避免存活对象过多导致的复制成本。

并发标记:G1 GC 会尽量在并发标记阶段结束后立即触发一次 Mixed GC。为了保证并发标记能够在合适的时间结束,G1 GC 会根据堆内存使用率和历史数据,动态地调整新生代的大小。

因此,新生代的动态性是 G1 GC 实现可预测的停顿时间和高吞吐量目标的一个重要方式。

相关文章:

G1 GC基本逻辑

1 MixedGC基本过程 在G1GC中,有两种主要的垃圾回收过程:Young GC和Mixed GC。这两者都是为了回收堆内存中的垃圾对象,但是他们关注的区域和工作方式有所不同。 Young GC: Young GC主要负责回收Young Generation(包括…...

nvidia安装出现7-zip crc error解决办法

解决办法:下载network版本,重新安装。(选择自己需要的版本) 网址:CUDA Toolkit 12.3 Update 1 Downloads | NVIDIA Developer 分析原因:local版本的安装包可能在下载过程中出现损坏。 本人尝试过全网说的…...

(C语言实现)高精度除法 (洛谷 P2005 A/B Problem II)

前言 本期我们分享用C语言实现高精度除法,可通过该题测试点我点我,洛谷 p2005。 那么话不多说我们开始吧。 讲解 大家还记不记得小学的时候我们是怎么做除法的?我们以1115为例。 我们的高精度除法也将采用这个思路进行,分别用两…...

【AI】Windows环境安装GroundingDINO

Grounding DINO简单来说,它可以根据文字描述检测指定目标。此外,当Grounding DINO与stable diffusion结合,便可以实现更神奇的功能–自动P图。在专业领域中,GroundingDINO可以用来进行遥感影像解译,可以减少人工工作量…...

【Node.js】基础梳理 6 - MongoDB

写在最前:跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识,需要格外注重实战和官方技术文档,文档建议作为手册使用 系列文章 【Node.js】笔记整理 1 - 基础知识【Node.js】笔记整理 2 - 常用模块【Node.js】笔记整理 3 - n…...

.NET8 依赖注入

依赖注入(Dependency Injection,简称DI)是一种设计模式,用于解耦组件(服务)之间的依赖关系。它通过将依赖关系的创建和管理交给外部容器来实现,而不是在组件(服务)内部直…...

Ubuntu18安装(重启黑屏问题)

1. F10 进入bios,选择u盘里的ubuntu镜像 2.进入使用ubuntu,下载 3.重启,esc 4.ubuntu 安e进入 5. nomodeset() F10 保存启动 6. 7.没有网 手机usb提供网络 下载有限网卡驱动...

[PyTorch][chapter 4][李宏毅深度学习][Gradient Descent]

前言: 目录: 1: 梯度下降原理 2: 常见问题 3: 梯度更新方案 4: 梯度下降限制 一 梯度下降原理 机器学习的目标找到最优的参数,使得Loss 最小 为什么顺着梯度方向loss 就能下降了。主要原理是泰勒公式。 假设损失函数为 忽略二阶导数, 当 …...

利用proteus实现串口助手和arduino Mega 2560的串口通信

本例用到的proteus版本为8.13,ardunio IDE版本为2.2.1,虚拟串口vspd版本为7.2,串口助手SSCOM V5.13.1。软件的下载安装有很多教程,大家可以自行搜索,本文只介绍如何利用这4种软件在proteus中实现arduino Mega 2560的串…...

Web APIs—介绍、获取DOM对象、操作元素内容、综合案例—年会抽奖案例、操作元素属性、间歇函数、综合案例—轮播图定时器版

版本说明 当前版本号[20231204]。 版本修改说明20231204初版 目录 文章目录 版本说明目录复习变量声明 Web APIs - 第1天笔记介绍概念DOM 树DOM 节点document 获取DOM对象案例— 控制台依次输出3个li的DOM对象 操作元素内容综合案例——年会抽奖案例操作元素属性常用属性修改…...

题目:分糖果(蓝桥OJ 2928)

题目描述&#xff1a; 解题思路&#xff1a; 本题采用贪心思想 图解 题解&#xff1a; #include<bits/stdc.h> using namespace std;const int N 1e6 9; char s[N];//写字符串数组的一种方法,像数组一样***int main() {int n, x;cin >> n >> x;for(int …...

Leetcode刷题笔记——摩尔投票法

摩尔投票法的核心思想为对拼消耗。 摩你妈&#xff0c;学不会&#xff01;&#xff01;&#xff01;&#xff01; 229. 多数元素 II - 力扣&#xff08;LeetCode&#xff09;...

RabbitMq整合Springboot超全实战案例+图文演示+源码自取

目录 介绍 简单整合 简单模式 定义 代码示例 work模式 定义 代码示例 pubsub模式 定义 代码示例 routing模式 定义 代码示例 top模式 定义 代码 下单付款加积分示例 介绍 代码 可靠性投递示例 介绍 代码 交换机投递确认回调 队列投递确认回调 ​延迟消…...

10-Hadoop组件开发技术

单选题 题目1&#xff1a;下列选项描述错误的是&#xff1f; 选项: A Hadoop HA即集群中包含Secondary NameNode作为备份节点存在。 B ResourceManager负责的是整个Yarn集群资源的监控、分配和管理工作 C NodeManager负责定时的向ResourceManager汇报所在节点的资源使用情况…...

postman参数为D:\\audio\\test.mp3请求报错

报错信息 报错 java.lang.IllegalArgumentException: Invalid character found in the request target [/v1/audio/transcriptions?audioPathD:\\audio\\test.mp3 ]. The valid characters are defined in RFC 7230 and RFC 3986 解决方式 yml文件上放行指定字符 relaxed-pa…...

进行主从复制时出现的异常FATAL CONFIG FILE ERROR (Redis 6.2.6)Reading the configuration file

错误如下所示&#xff1a; FATAL CONFIG FILE ERROR (Redis 6.2.6) Reading the configuration file, at line 1 >>> include/myredis/redis.conf Bad directive or wrong number of arguments出现错误的原因是.conf文件中命令之间缺少空格&#xff0c;如下所示&…...

611.有效的三角形个数

1.题目解析 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 补充&#xff1a; 1.三角形的判断&#xff1a;假设有三条边按大小排序&#xff1a; 2.题目示例 示例 1: 输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用…...

超详细,使用JavaScript获取短信验证码

一、引言 短信验证码的重要性已经不言而喻,那么如何使用avaScript获取短信验证码呢?今天小编就整理了超详细的攻略,请各位看好~ 二、准备工作 1.注册短信服务提供商 注册并登录你的短信平台,然后获取AppID和AppKey,注册地址在代码里 2.创建验证码模版 三、实现步骤 …...

利用 Python 进行数据分析实验(七)

一、实验目的 使用Python解决问题 二、实验要求 自主编写并运行代码&#xff0c;按照模板要求撰写实验报告 三、实验步骤 操作书上第九章内容请画出如图2.png所示的图形通过编码获得fcity.jpg的手绘图像&#xff08;如beijing.jpg所示&#xff09; 四、实验结果 T2 &qu…...

前端小技巧: 写一个异步程序示例, 使用任务队列替代promise和async/await等语法糖

异步程序设定场景 1 &#xff09;场景设定 可以使用懒人每做几件事&#xff0c;就要休息一会儿&#xff0c;并且不会影响做事的顺序这种场景来模拟定义单例名称为: lazyMan支持 sleep 和 eat 两个方法支持链式调用 2 ) 调用示例 const lm new LazyMan(www) lm.eat(苹果).…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...