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

聊聊JVM G1(Garbage First)垃圾收集器

CMS的垃圾回收机制,为什么分为四步icon-default.png?t=O83Ahttps://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文件夹&#xf…...

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. 关系&#xff0…...

365天深度学习训练营-第P7周:马铃薯病害识别(VGG-16复现)

文为「365天深度学习训练营」内部文章 参考本文所写记录性文章,请在文章开头带上「👉声明」 🍺 要求: 自己搭建VGG-16网络框架【达成√】调用官方的VGG-16网络框架【达成√】如何查看模型的参数量以及相关指标【达成√】 &#…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

ESP32读取DHT11温湿度数据

芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...

Bean 作用域有哪些?如何答出技术深度?

导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答&#xff0c…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC&#xf…...