聊聊JVM G1(Garbage First)垃圾收集器
CMS的垃圾回收机制,为什么分为四步
https://blog.csdn.net/genffe880915/article/details/144205658说完CMS垃圾回收器,必定要说到目前一般应用项目中都推荐的G1。G1在JDK1.7 update4时引入,在JDK9时取代CMS成为默认的垃圾收集器。它是HotSpot在JVM上力推的垃圾收集器,并赋予取代CMS的使命。
简述
G1垃圾收集器不同于老版垃圾收集器,采用了独特的内存管理策略,实现了对整个堆空间的垃圾收集。G1分代上还是参考了老版的设计思想。它将堆内存分为多个大小相等的区域(Region),每个Region可以是Eden区、Survivor区或者Old区。

通过以下参数可以启用G1、设置Region的大小等:
// 整堆启用G1的垃圾回收器
-XX:+UseG1GC// 设置最大暂停时间(默认200ms)
-XX:MaxGCPauseMillis=n// 指定Region的内存大小,n必须是2的指数幂,其取值范围是从1M到32M
-XX:G1HeapRegionSize=n// 指定垃圾回收工作的线程数量
-XX:ParallelGCThreads=n
G1还对大对象(Humongous)进行了独立的处理,在国内的很多资料中介绍都会称为Humongous区,将该Region和Old区进行区分开来。但是我参考外网的资料我发现其介绍如下:
In G1 GC we've already described how objects are stored in regions. If the object size is equal to or greater than 50% of the region size, it is considered a humongous object. Humongous objects are allocated directly to the old generation, are handled differently and can cause fragmentation.
如果我没理解错的话,大对象会直接分配到Old区,并没有独立分区的概念。
Whatever,为便于理解我们还是称为Humongous区。
Houmongous区的判断规则为当一个对象大于或等于Region大小的50%,甚至可能横跨了多个Region来存放。
G1根据每个Region的垃圾收集情况来决定下一次的垃圾收集Region,这样避免了对整个堆内存收集,从而减少垃圾收集时间。
原理
G1垃圾收集模式有两种:Young GC和Mixed GC
Young GC主要针对年轻代区域,包括Eden区和Survivor区。当所有Eden区使用率达到了最大阈值(默认60%)或者G1计算出来的回收时间接近用户设定的最大暂停时间时,会触发Young GC。将这两个Region的对象复制到另外的Survivor。
Young GC在收集时采用了三个关键技术,分别是记忆集、卡表和写屏障。
- 记忆集是G1内部维护引用关系表,记录了跨代引用(不会记录年轻代的互相引用),即非回收区域(老年代)对象引用回收区域对象的关系。
- 卡表、卡页:每个Region可以继续划分就成为卡页,每个Region会额外配置一小块内存用于记录堆中哪些卡页引用了自己Region中的对象,称为卡表。如果引用了自己Region中的对象,则称为脏卡。
- 写屏障实际上是更新卡表的技术,类似于Java中AOP技术。在用户线程中老年代的对象引用了年轻代对象时,更改卡表中对应的字节为脏卡,同时将脏卡放入一个队列中,JVM有独立的线程定期读取队列中的数据,更新数据集。

记忆集记录了跨代的引用,在GC的时候,可以快速的借助它和GC Roots搞定跨代引用的可达对象分析问题,提高收集效率。
Mixed GC为G1特有的收集方式,针对年轻代和部分老年代区域。当老年代的使用率达到了阈值(默认45%)或年轻代被分配了Humougous对象,会触发Mixed GC,回收所有年轻代和一部分老年代区。
在回收老年代的时候,往往因为对象较多,G1为提高收集效率并减少STW,耗时长的阶段采用了用户线程并行方式,总体分为初试标记、并发标记、最终标记、清理和转移。这几个方式听起来是不是和CMS的部分阶段挺类似的。
- 初始标记阶段,G1会短暂STW,快速标记出和GC Roots跟对象直接关联的对象。
- 并发标记阶段是从GC Roots直接关联的对象出发,完整遍历堆内的关联对象,这个耗时较长,但是与用户线程并行。
- 最终标记会STW,主要用于修正并发标记期间发生变动的对象。
- 清理阶段也会暂停用户线程,在标记完成后,G1垃圾收集器会整理Region区,调整记忆集,当某个Region没有存活对象后,则清理该Region。
- 转移阶段也会STW,将某个Region存活的对象赋值到另外一个Region。
总结
在上面的原理中,Mixed GC会暂停用户线程三次,但是在G1垃圾收集器中,采用的记忆集、卡表和写屏障的技术,有点类似数据库的索引一样,最大程度的减少了STW的时间。
当整个G1垃圾收集器也并不是我所描写的这么简单,例如MixedGC中用到的三色标记算法和SATB技术,还有更多深层的技术细节期待与诸位共同学习,本文仅做初步的概念普及。
欢迎使用haptool.com(哈普工具),让程序员的工作更有效率。
相关文章:
聊聊JVM G1(Garbage First)垃圾收集器
CMS的垃圾回收机制,为什么分为四步https://blog.csdn.net/genffe880915/article/details/144205658说完CMS垃圾回收器,必定要说到目前一般应用项目中都推荐的G1。G1在JDK1.7 update4时引入,在JDK9时取代CMS成为默认的垃圾收集器。它是HotSpot…...
【论文复现】隐式神经网络实现低光照图像增强
📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ 隐式神经网络实现低光照图像增强 引言那么目前低光照图像增强还面临哪些挑战呢? 挑战1. 不可预测的亮度降低和噪声挑战2.度量友好…...
Python知识分享第十九天-网络编程
网络编程 概述用来实现 网络互联 不同计算机上运行的程序间可以进行数据交互也叫Socket编程 套接字编程 三要素IP地址概述设备在网络中的唯一标识分类IPV4城域网13广域网22局域网31IPV6八字节 十六进制相关dos命令查看ipwindows: ipconfigmac和linux: ifconfig测试网络ping 域…...
C# 绘制GDI红绿灯控件
C# 绘制GDI红绿灯控件 using System; using System.Windows.Forms; using System.Drawing;public class TrafficLightControl : Control {protected override void OnPaint(PaintEventArgs e){base.OnPaint(e);Graphics g e.Graphics;g.SmoothingMode System.Drawing.Drawin…...
Centos 8 服务器时间校正
Centos 8 服务器时间校正 使用chrony服务自动同步时间: 1.安装chrony: sudo dnf install chrony 2.启动并使chrony服务自动启动: sudo systemctl start chronyd sudo systemctl enable chronyd 3.添加配置置文件/etc/chrony.conf指向了可靠…...
模型 正则化方法(通俗解读)
系列文章 分享 模型,了解更多👉 模型_思维模型目录。控制模型复杂度,防过拟合。 1 正则化方法的应用 1.1 正则化方法在教育领域的应用案例 - 重塑教学模式 背景: 在教育领域,正则化方法可以被理解为对教学模式和学习…...
ffmpeg命令
ffmpeg是专门处理多媒体文件(包括音频、视频)的命令; ffplay 是 ffmpeg 软件包中的一个命令行多媒体播放器,它主要用于播放音视频文件; # fmpeg命令转换格式,将mp3格式转换为wav格式 ffmpeg -i input.mp3…...
使用 EasyExcel 实现高效的 Excel 读写操作
在日常开发中,Excel 文件的读写操作是一个常见的需求。EasyExcel 是阿里巴巴开源的一个高性能、易用的 Excel 读写库,可以大幅提高处理 Excel 文件的效率。它通过事件驱动模型优化了大数据量 Excel 的读写性能,非常适合处理大文件或高并发场景…...
数据结构(栈Stack)
1.前言: 在计算机科学中,栈(Stack)是一种基础而存在的数据结构,它的核心特性是后进先出(LIFO,Last In, First Out)。想象一下,在现实生活中我们如何处理一堆托盘——我们…...
Windows 11 环境下 条码阅读器输入到记事本的内容不完整
使用Windows11时,为什么记事本应用程序中的扫描数据被截断或不完整?为什么sdo 特殊字符的显示与Windows 10 记事本应用程序不同? 很多人认为和中文输入法有关,其实主要问题出在这个windows11下的记事本程序上,大家知道这个就可以了&#x…...
【串口助手开发】visual studio 使用C#开发串口助手,生成在其他电脑上可执行文件,可运行的程序
1、改成Release,生成解决方案 串口助手调试成功后,将Debug改为Release,点击生成解决方案 2、运行exe文件 生成解决方案后,在bin文件夹下, Release文件夹下,生成相关文件 复制一整个Release文件夹…...
Redis设计与实现读书笔记
Redis设计与实现读书笔记 Redis设计与实现[^1]简单动态字符串SDS的基础定义与C字符串的差别常数获取长度杜绝缓冲区溢出减少修改字符串时带来的内存重分配次数二进制安全函数兼容 链表链表和链表节点的实现 字典字典的实现哈希表定义哈希表节点定义字典定义 哈希算法解决键冲突…...
UE5 Do Once 节点
在 Unreal Engine 5 (UE5) 中,Do Once 节点是一个蓝图节点,用于确保某个操作或代码只执行一次,直到某些条件被重置。它通常用于处理需要执行一次的逻辑,例如初始化、事件触发、或防止重复执行某些操作。 如何使用 Do Once 节点&a…...
javascript(前端)作为客户端端通过grpc与cpp(服务端)交互
参考文章 https://blog.csdn.net/pathfinder1987/article/details/129188540 https://blog.csdn.net/qq_45634989/article/details/128151766 前言 临时让我写前端, 一些配置不太懂, 可能文章有多余的步骤但是好歹能跑起来吧 你需要提前准备 公司有自带的这些, 但是版本大都…...
前端常用缓存技术深度剖析
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
Asp.net Mvc在VSCore中如何将增删改查的增改添加数据传输到页面(需配合上一篇Mvc的增删改查一起)
Linq集成查询(关联Lambda) First FirstOrDefault 找到第一个符合条件的元素 First(x >x.Id id) 返回第一个Id等于id的元素,如果都没有符合的,报错FirstOrDefault(x >x.Id id) 返回第一个Id等于id的元素,如果…...
Android显示系统(04)- OpenGL ES - Shader绘制三角形
一、前言: OpenGL 1.0采用固定管线,OpenGL 2.0以上版本重要的改变就是采用了可编程管线,Shader 编程是指使用着色器(Shader)编写代码来控制图形渲染管线中特定阶段的处理过程。在图形渲染中,着色器是在 GP…...
微信 创建小程序码-有数量限制
获取小程序码:小程序码为圆图,有数量限制。 目录 文档 接口地址 功能描述 注意事项 请求参数 对接 获取小程序码 调用获取 小程序码示例 总结 文档 接口地址 https://api.weixin.qq.com/wxa/getwxacode?access_tokenaccess_token 功能描述 …...
重生之我在异世界学编程之C语言:操作符篇
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文1. 算术操作符2. 关系࿰…...
365天深度学习训练营-第P7周:马铃薯病害识别(VGG-16复现)
文为「365天深度学习训练营」内部文章 参考本文所写记录性文章,请在文章开头带上「👉声明」 🍺 要求: 自己搭建VGG-16网络框架【达成√】调用官方的VGG-16网络框架【达成√】如何查看模型的参数量以及相关指标【达成√】 &#…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
Axure零基础跟我学:展开与收回
亲爱的小伙伴,如有帮助请订阅专栏!跟着老师每课一练,系统学习Axure交互设计课程! Axure产品经理精品视频课https://edu.csdn.net/course/detail/40420 课程主题:Axure菜单展开与收回 课程视频:...
