G1 垃圾回收器

news2025/3/1 13:49:40

 引用:

  1. G1垃圾收集器详解_fyygree的博客-CSDN博客

  2. 深入解析G1垃圾收集器与性能优化_铁锚的博客-CSDN博客

  3. 垃圾回收器之 G1 垃圾回收器_嘿,鱼骨头^O^的博客-CSDN博客

G1是一款增量式的分代垃圾收集器

G1 物理上不分代,默认会将整个内存区域分为2048个region,region的大小为1MB-32MB,且为2的N次幂。适合内存大的jvm。 region可分为四种类型,且region并不是固定的,运行时会改变

  • Eden Space 新生代

  • Survivor Space 存活区

  • Old Generation 老年代

  • humongous 存储大对象,如果超过0.5个region,就放入humongous

    对于堆中的大对象,默认直接会被分配到老年代,但是如果它是一个短期存在的大对象, 就会对垃圾收集器造成负面影响。为了解决这个问题,G1划分了一个Humongous区, 它用来专门存放大对象。如果一个H区装不下一个大对象,那么G1会寻找连续的H区来 存储。为了能找到连续的H区,有时候不得不启动Full GC。 G1的大多数行为都把H区 作为老年代的一部分来看待。

    img

G1尽可能多的从有空闲的region中回收内存,同时到达预期的暂停时间指标。

card table (卡表)

在这里插入图片描述

老年代的每个region是有card组成的, 每个card 的大小是大约是512k。如果老年代的对象引用了新生代的对象,我们就把这个card标记为脏card,这样根据GC roots 找对象的时候就不用遍历整个老年代了,只在脏card中寻找就可以了。减少扫描范围,提升效率

RememberSet(记忆集)

在这里插入图片描述

新生代中每个region中都有个RememberSet(记忆集),简称Rset,用来记录哪个card指向这个region的引用。通过这种数据结构,G1就可以进行增量式回收内存,而不用扫描整个堆内存,因为只要扫描Rset,就可以知道哪些跨区的引用指向这个Region,从而对这些region进行回收。

G1的垃圾回收模式

  • young GC:只回收新生代

    会收集eden区和上一次gc使用的存活区,采用复制的方式转移到新的Region中,如果达到分代年龄或者其他条件,会转移到老年代中

    默认老年代占用到整个堆空间的大约45%时,它就会进行这个并发标记

  • mixedGC:回收一部分新生代和老年代

    当老年代的内存超过一个阈值。并发标记完毕之后,会从 young GC模式切换到mixed GC,除了回收eden区和上一次gc使用的存活区,还会选择一部分的老年代进行回收。在进行老年代回收时依然采用复制算法,因为复制算法执行的快。经过多次混合模式的垃圾回收,很多老年代的region已经被处理过了,就会切换到young GC

    tips:

    如果你的回收速度是高于新的用户线程产生的垃圾的速度的时候,也就是我的回收速度比你新产生的垃圾快,来得及打扫,这个时候还不叫 Full GC,这个时候还是处于并发垃圾收集的阶段,虽然重新标记和数据拷贝的过程还会有暂停,但是这个暂停时间还是相对很短的,这还称不上 Full GC,那 G1在什么时候才会发生 Full GC呢,就是当你的垃圾回收的速度跟不上垃圾产生的速度了,新产生的垃圾比你的回收速度快了,这个时候并发收集就失败了,就跟以前的 CMS 类似,这时候它就会退化一个串行的收集,串行收集这时候就会叫Full GC了,特别的慢,当然也会更长时间的 STW 导致响应时间变长。

标记的各个阶段

  • 初始标记。stw,扫描GC roots

  • 并发标记。根据GC roots扫描整个堆,找到存活的对象

  • 重新标记。stw,通过写屏障+SATB(原始对象快照)的方式标记对象

    它是在pre-write barrier写屏障技术在对象引用改 变前把这个对象加入到了一个队列,并且表示它是未被处理的,这个队列的名称叫 satb_mark_queue,将来的 Remark 阶段就可以配合这个队列来对这些对象进行进一步的判断,

  • 并发清楚。

G1垃圾收集器的运行过程:

①. G1 GC的垃圾回收过程主要包括如下三个环节:

  • 年轻代GC (Young GC)

  • 老年代并发标记过程 (Concurrent Marking)

  • 混合回收(Mixed GC)

(如果需要,单线程、独占式、高强度的Full GC还是继续存在的。它 针对GC的评估失败提供了-种失败保护机制,即强力回收。)

img

顺时针young gc -> young gc + concurrent mark-> Mixed GC顺序,进行垃圾回收

②. 应用程序分配内存,当年轻代的Eden区用尽时开始年轻代回收过程;*G1的年轻代收集阶段是一个*并行(多个垃圾线程)的独占式收集器。在年轻代回收期,G1 GC暂停所有应用程序线程,启动多线程执行年轻代回收。然后从年轻代区间移动存活对象到Survivor区间或者老年区间,也有可能是两个区间都会涉及

③. 当堆内存使用达到一定值(默认45%)时,开始老年代并发标记过程

④. 标记完成马上开始混合回收过程。对于一个混合回收期,G1 GC从老年区间移动存活对象到空闲区间,这些空闲区间也就成为了老年代的一部分。和年轻代不同,老年代的G1回收器和其他GC不同,G1的老年代回收器不需要整个老年代被回收,一次只需要扫描/回收一小部分老年代的Region就可以了。同时,这个老年代Region是和年轻代一起被回收的。

⑤. 举个例子:一个Web服务器,Java进程最大堆内存为4G,每分钟响应1500个请求,每45秒钟会新分配大约2G的内存。G1会每45秒钟进行一次年轻代回收,每31个小时整个堆的使用率会达到45%,会开始老年代并发标记过程,标记完成后开始四到五次的混合回收

G1的可选过程:Full GC

  • G1的初衷就是要避免Fu1l GC的出现。但是如果上述方式不能正常工作,G1会停止应用程序的执行(Stop-The-World) ,使用单线程的内存回收算法进行垃圾回收,性能会非常差,应用程序停顿时间会很长。

  • 要避免Full GC的发生,一旦发生需要进行调整。什么时候会发生Full GC呢? 比如堆内存太小当G1在复制存活对象的时候没有空的内存分段可用,则会回退到full gc, 这种情况可以通过增大内存解决。

  • 导致G1Full GC的原因可能有两个: .

    1. 回收的时候没有足够的to-space来存放晋升的对象

    2.并发处理过程没完成空间就耗尽了

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

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

相关文章

React - Jsx 概述

React - Jsx 概述 JSX 概述 目标: 了解 JSX 是什么、与 React.createElement 之间的关系 JSX 语法是另一种在 React 中创建元素的方式 使用他创建元素更加的简单 直接。 JSX 是 javaScript XML 简写 可以理解为在 JavaScript 中写 XML 格式的代码 const list (&…

力扣(LeetCode)808. 分汤(C++)

动态规划 如图,本题的状态表示,是二维 dpdpdp f[i,j]f[i,j]f[i,j] , iii 表示剩余的 aaa , jjj 表示剩余的 bbb , f[i,j]f[i,j]f[i,j] 表示 aaa 先取完的概率 。 按照 i/ji/ji/j 的剩余数量做集合划分 ①当 i≤0,j≤0…

代码冲突的产生以及解决方式

Git代码冲突解决 为什么会产生代码冲突? 远程仓库的某个文件内容发生了修改,而本地没有及时进行pull拉取,那么就会导致本地的分支落后。当修改完本地代码再push到远程的时候,就会产生代码冲突。如何避免产生代码冲突?…

GitHub标星75k,阿里15W字的Spring高级文档(全彩版)真的太香了

随着 Spring 使用越来越广泛,Spring 已经成为 Java 程序员面试的必问知识点,很多同学对于Spring理解不是那么的深刻,经常就会被几个连环追问给干趴了! 今天小编整理了一下一线架构师的Spring源码高级文档:SpringSprin…

基础:BS(Browser/Server)、CS(Client/Server)架构

一、BS(Browser/Server) 所有浏览器应用都是BS架构。 BS(Browser/Server):浏览器 / 服务器结构。BS是伴随着Internet技术的兴起,对C/S架构的改进,为了区别于传统的C/S 模式,特意称为…

亚马逊、沃尔玛、美客多测评补单是什么?自养号需要解决哪些问题?

​做跨境电商很多卖家会疑惑测评(补单)是什么?为什么需要测评或者补单? 其实测评或补单都是类似于国内电商(某宝,某东)的刷单。 测评补单作用:快速提高产品的排名、权重和销量 可…

如何在 VMware Workstation 16.2 中安装 Ubuntu 20.04

安装 Ubuntun 20.04 如今,Linux 操作系统越来越受欢迎。大多数服务器都使用Linux操作系统,个人系统也开始使用各种 Linux 发行版。Ubuntu 是流行的 Linux 操作系统之一。 一、在搜栏中搜索 VMware Workstation 并打开它 二、在主页上点击“创建新的虚拟机”。当你开始准备时…

TensorFlow中的tf.nn.softmax_cross_entropy_with_logits_v2函数详解

一、函数介绍 函数形式:tf.nn.softmax_cross_entropy_with_logits_v2(labelslabels, logitslogits) 需要注意的是,此处是最常见的参数形式,即只有labels和logits参数。为了简单起见,这里不对其他参数进行赘述。其中,…

【AtCoder】离线询问+树状数组

文章目录题目描述题意思路代码D - AtCoder Express 2 题目描述 input#1: 2 3 1 1 1 1 2 2 2 1 2 output#1: 3 input#2: 10 3 2 1 5 2 8 7 10 1 7 3 10 output#2: 1 1 input#3: 10 10 10 1 6 2 9 4 5 4 7 4 7 5 8 6 6 …

【虹科案例】极高的精度水平——虹科数字化仪在大型强子对撞机机器保护系统中的应用

大型强子对撞机机器保护系统 CERN(欧洲核子研究中心) 的大型强子对撞机 (LHC) 的机器保护系统中使用了140 多张虹科数字化仪卡。这些板卡用于检查粒子束是否已准确偏转。这需要极高的精度,因为在 27 公里 LHC 加速器环中,两束高能…

19182 石子合并(基础版)

题目 19182 石子合并(基础版) 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: 不限定 Description 设有 N(N≤300) 堆石子排成一排,其编号为1,2,3,⋯,N。每堆石子有一定的质量 mi(mi≤1000)。 现在要将这N堆…

什么是JavaScript一文教会你

目录 文章目录**二、什么是JavaScript,有什么用?**三、HTML嵌入JavaScript的方式:第一种方式:第二种方式:第三种方式:四、JavaScript的变量五、函数初步**函数参数中的几个场景****情景1:传入参数不足****…

MyBatis--自定义映射resultMap

1.处理下划线与属性名不一致的方法 字段名和属性名不一致的情况 , 如何处理映射关系 解决方法 : 1. 为查询的字段设置别名 , 和属性名保持一致 例 : selectemp_id empId , emp_name empName , age , genderfromt_emp where emp_id #{empId} 2. 当字段符合MySql 的要求使用 _…

软文发布推广需要注意的问题有哪些

随着互联网的发展,软文发稿这种以文章为载体、并带有很强隐蔽性的广告形式也得到了飞速发展,这种营销形式实际上具有非常广泛的传播性、并兼具成本低、权威性等优势,可有效帮助企业实现品牌的宣传推广、提升产品的销售转化率。那么软文发稿需…

上海亚商投顾:沪指探底回升 供销社、新冠检测概念领涨

上海亚商投顾前言:无惧大盘大跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪A股今日小幅调整,三大指数盘初均跌超1%,随后震荡回升跌幅收窄,创业板指一度接近…

Android 发布自己的sdk

作为一个开发,总是会跟开源组件打交道,现在记下我自己写的开源组件遇到的问题 1.创建一个Android Library 2.修改build.gradle plugins {id com.android.application } 里面的id com.android.application 改为 id com.android.library android {compileSdk 32defaultConf…

艾美捷Immunochemistry FAM-FLICA Caspase-1检测方案

Caspases在细胞凋亡和炎症中发挥重要作用。ICT的FLICA检测试剂盒被研究人员用于通过培养的细胞和组织中的胱天蛋白酶活性来定量凋亡。 艾美捷Immunochemistry FAM FLICA Caspase-1探针允许研究人员评估Caspase-1的激活。FLICA试剂FAM-YVAD-FMK进入每个细胞,并不可逆…

【第十二篇】Camunda系列-事件篇-信号事件

信号事件 1. 开始事件 通过信号来启动流程实例 部署流程和发送信号来启动流程 /*** 部署流程*/@Testpublic void deployFlow(){Deployment deploy = repositoryService.createDeployment(<

2022卡塔尔世界杯:TikTok卖家如何把握这四年一度的营销机遇?

2022卡塔尔世界杯已正式开幕&#xff0c;这四年一度规模最大的足球赛事&#xff0c;也是全民体育狂欢节。这样的高关注度&#xff0c;必然会带来高流量&#xff0c;而流量就是金钱。没有卖家能在如此巨大的流量面前无动于衷&#xff0c;尤其是运动类品牌。TikTok作为世界杯流量…

海绵城市解决方案-最新全套文件

海绵城市解决方案-最新全套文件一、建设背景1、建设海绵城市主要有三个意义&#xff1a;2、当前我国海绵城市建设面临的困境二、建设架构三、建设方案1、“渗”&#xff1a;能把更多的雨水渗透到城市的地下储存起来2、“滞”&#xff1a;不能让雨水很快流走&#xff0c;也是要把…