JVM(HotSpot):GC之G1垃圾回收器

文章目录

  • 一、简介
  • 二、工作原理
  • 三、Young Collection 跨代引用
  • 四、大对象问题

一、简介

1、适用场景

  • 同时注重吞吐量(Throughput)和低延迟(Low latency),默认的暂停目标是 200 ms
  • 超大堆内存,会将堆划分为多个大小相等的 Region(对JVM空间进行了重新个规划)
  • 整体上是标记+整理算法,两个区域之间是复制算法
  • JDK9 时,默认启用G1

2、相关参数

-XX:+UseG1GC	开启G1
-XX:G1HeapRegionSize=size	设置region的大小,一般默认为1248m
-XX:MaxGCPauseMillis=time	设置单次STW最长时间,单位毫秒

二、工作原理

1、大致流程图

分为三个循环阶段

  • 年轻代的垃圾收集
  • 年轻代的垃圾收集 + 并发标记
  • 混合收集
    在这里插入图片描述
    2、Young Collection
  • 这个阶段,会发生STW
    新创建的对象会存入Eden区域
    在这里插入图片描述
    Eden逐渐增多后,会发生一次Minor GC,并将存活的对象存入S 区(Survivor
    在这里插入图片描述
    当多次Minor GC之后,S区对象的年龄达到一定阈值,默认15岁,则晋升到老年代,并将其他存活的对象复制到另外一个S区。
    在这里插入图片描述
    3、Young Collection + CM
  • Young GC 时会进行 GC Root 的初始标记,初始标记会STW,并且只会发生在Young GC中。
  • 老年代占用堆空间比例达到阈值时(-XX:InitiatingHeapOccupancyPercent,默认45%),进行并发标记(不会 STW
    在这里插入图片描述
    4、Mixed Collection
    会对 E、S、O 进行全面垃圾回收,类似之前的Ful GC,但是,这里不能称之为Full GC
  • 最终标记(Remark)会 STW
  • 拷贝存活(Evacuation)会 STW
  • -XX:MaxGCPauseMillis=ms
    当老年代占用的比例达到阈值时,会触发Mixed Collection
    过程如下:
    先进行年轻代的Minor GC,然后,对老年代进行垃圾收集,因为,存在MaxGCPauseMillis这个参数的限制,所以,每次的回收STW时间不能超过它,就决定了,每次的回收量有限。
    这时候,G1会优先回收O区垃圾较多的Region,这就是G1名称的由来原因。
    并将O区存活的对象,拷贝到另外一个O区。

在这里插入图片描述

三、Young Collection 跨代引用

新生代回收的跨代引用(老年代引用新生代)问题
问题是这样的:
由于O区对象非常多,新生代对象被O区引用,那么,在判断GC Root时,就要遍历整个O区,这样就非常影响性能。
所以,这里为了优化性能,引入了卡表技术与Remembered Set
在这里插入图片描述
当老年代引用了新生代对象时,这个老年代对象存放的区域就被标记为脏卡区域
从而,在遍历GC Root时,直接去脏卡区域查找,节省了大量时间。
那么,有人会问,此处为什么不用队列存放所有O区跨代引用的对象了?
我想,一方面队列也是对象,另外,这样违背GC Root的定义。

在这里插入图片描述

四、大对象问题

我想,对算法方案比较擅长的同学,应该会有这样一个问题。
G1JVM空间划分为Region区域,那么,如果一个巨型对象来了,如何存放?
Region是不是就类似前面的内存碎片了?

定义:一个对象大于 region 的一半时,称之为巨型对象
巨型对象的存储:
在这里插入图片描述
如何回收?
G1 不会对巨型对象进行拷贝,并且回收时被优先考虑
一般情况下,不会把巨型对象放在内存中很久的。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第12次CCF CSP认证真题解

1、最小差值 题目链接&#xff1a;https://sim.csp.thusaac.com/contest/12/problem/0 100分代码&#xff1a; #include <iostream> #include <algorithm> using namespace std; int main(int argc, char *argv[]) {int n;cin >> n;int a[1010],b[1010];f…

【读书笔记·VLSI电路设计方法解密】问题28:什么是芯片可靠性

一块VLSI芯片不仅需要在前几天、几周或几个月内正常工作,还必须在整个使用寿命内可靠运行。任何用于商业目的的芯片的寿命通常定义为100,000小时或约11.4年。然而,在IC的设计、制造、组装和测试过程中,许多因素可能导致其早期失效。这一芯片开发方面被称为芯片可靠性。测试相…

LinkedList和链表之刷题课(下)

1. 给定x根据x把链表分割,大的结点放在x后面,小的结点放在x前面 题目解析: 注意此时的pHead就是head(头节点的意思) 基本上就是给定一个链表,我们根据x的值来把这个链表分成俩部分,大的那部分放在x后面,小的那部分放在x前面,并且我们不能改变链表本来的顺序,比如下面的链表,我…

【数据结构与算法】《Java 算法宝典:探秘从排序到回溯的奇妙世界》

目录 标题&#xff1a;《Java 算法宝典&#xff1a;探秘从排序到回溯的奇妙世界》一、排序算法1、冒泡排序2、选择排序3、插入排序4、快速排序5、归并排序 二、查找算法1、线性查找2、二分查找 三、递归算法四、动态规划五、图算法1. 深度优先搜索&#xff08;DFS&#xff09;2…

Ubuntu22.04环境搭建MQTT服务器

官网&#xff1a; https://mosquitto.org 1.引入库 sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa2.升级安装工具 sudo apt-get update 3.安装 sudo apt-get install mosquitto 4.安装客户端 sudo apt-get install mosquitto-clients5.添加修改配置文件 进…

MySql数据库中数据类型

本篇将介绍在 MySql 中的所有数据类型&#xff0c;其中主要分为四类&#xff1a;数值类型、文本和二进制类型、时间日期、String 类型。如下&#xff08;图片来源&#xff1a;MySQL数据库&#xff09;&#xff1a; 目录如下&#xff1a; 目录 数值类型 1. 整数类型 2. …

Python | Leetcode Python题解之第516题最长回文子序列

题目&#xff1a; 题解&#xff1a; class Solution:def longestPalindromeSubseq(self, s: str) -> int:n len(s)dp [[0] * n for _ in range(n)]for i in range(n - 1, -1, -1):dp[i][i] 1for j in range(i 1, n):if s[i] s[j]:dp[i][j] dp[i 1][j - 1] 2else:dp…

【java】java的基本程序设计结构04-数值类型的转换

类型默认值 int, short, long, byte 的默认值是0。char 的默认值是 \u0000&#xff08;空字符&#xff09;。float 的默认值是 0.0f。double 的默认值是 0.0d。boolean 的默认值是 false。引用类型&#xff08;类、接口、数组&#xff09;的默认值是 null。 引用类型 在Java中…

Kafka如何控制消费的位置?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka如何控制消费的位置?】面试题&#xff1f;希望对大家有帮助&#xff1b; Kafka如何控制消费的位置? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Kafka 中&#xff0c;控制消费位置主要通过以下几个机制来实…

C++-继承

目录 一、继承的概念和定义 1、继承概念 2、继承的语法格式 3、继承的方式 4、继承类模板 二、基类和派生类之间的转换 三、继承中的作用域 四、派生类的默认成员函数 一、默认成员函数介绍 1、派生类中基类成员的构造 2、派生类中基类成员拷贝构造 3、复制重载 4、…

帝佛卡干邑荣耀登陆泰国王权King Power

帝佛卡干邑与泰国王权免税集团&#xff08;King Power&#xff09;达成深度合作&#xff0c;共同将法国帝佛卡干邑品牌推向泰国旅游零售市场。此次合作不仅标志着帝佛卡干邑在国际市场的又一重要突破&#xff0c;也彰显了双方对高品质产品的共同追求。 帝佛卡干邑于2024年8月正…

[Python学习日记-53] Python 中的正则表达式模块 —— re

[Python学习日记-53] Python 中的正则表达式模块 —— re 简介 re 模块 练习 简介 我们在编程的时候经常会遇到想在一段文字当中找出电话号码、身份证号、身高、年龄之类的信息&#xff0c;就像下面的数据一样 # 文件名&#xff1a;美丽学姐联系方式.txt 姓名 地区 …

WinRAR技巧:如何独立压缩文件夹内的每个文件?

不知道大家是否会遇到这种情况&#xff0c;将文件夹内的多个文件或文件夹压缩成一个个压缩包文件&#xff0c;这种情况除了将文件夹中的文件一个个压缩&#xff0c;还有什么批量操作的方法呢&#xff1f;今天分享使用WinRAR批量压缩文件到每个单独的文件夹的方法。 方法如下&a…

pdf压缩如何操作?教你8招,轻松搞定文件压缩!

电脑上如果存有大量的pdf文件&#xff0c;那么一定会占用一定的空间&#xff0c;不仅不利于存储还影响传输速度。如果想要将pdf压缩变小&#xff0c;那么本文分享的内容可就要了解下了。 PDF文件怎么压缩变小&#xff1f;pdf压缩是一种常见的文件处理需求。无论是处理个人文档…

offset Explorer连接云服务上的kafka连接不上

以上配置后报连接错误时&#xff0c;可能是因为kafka的server.properties配置文件没配置好&#xff1a; 加上面两条配置&#xff0c;再次测试连接&#xff0c;成功 listeners和advertised.listeners

DICOM 基础知识:深入理解DICOM数据结构与标签说明

目录 DICOM 图像概念 DICOM 图像关键特性&#xff1a; DICOM 文件结构 常见数据元素&#xff1a; 数据元素示例详解 DICOM-VR 数据类型说明 DICOM 标准支持的数据集 结语 DICOM 图像概念 DICOM&#xff08;Digital Imaging and Communications in Medicine&…

ELK之路第二步——可视化界面Kibana

Kibana 1.安装2.解压3.修改配置4.启动 这部分内容就比较简单了&#xff0c;水一片文章。 1.安装 需要梯子 官网下载链接&#xff1a;https://www.elastic.co/cn/downloads/past-releases/kibana-7-3-0 如果你去官网下载页面&#xff0c;点击下载是404报错&#xff0c;记得切换…

UE5之5.4 第三人称示例代码阅读

第三人称的代码相对第一人称少了很多&#xff0c;只有一个移动跳跃的能力 构造函数&#xff0c;添加角色的移动属性&#xff0c;限制了当controller移动角色不会乱转&#xff0c;然后创建了一个相机杆&#xff0c;创建了一个跟随相机&#xff0c;绑到相机杆上 然后在这个函数设…

SpringMVC6-SpringMVC的视图

目录 ThymeleafView 转发视图 重定向视图 视图控制器view-controller SpringMVC中的视图是View接口&#xff0c;视图的作用&#xff1a;渲染数据&#xff0c;将模型Model中的数据展示给用户 SpringMVC视图的种类很多&#xff0c;默认有转发视图InternalResourceView 和重定…

基于Qt的多线程并行和循序运行实验Demo

致谢&#xff08;Acknowledgement&#xff09;&#xff1a; 感谢Youtube博主Qt With Ketan与KDAB精心录制的Qt多线程处理应用教程&#xff0c;感谢Bilibili博主爱编程的大丙对Qt多线程与线程池内容深入浅出的讲解。 一、计算机线程相关概念 线程概念[1]&#xff1a; 在计算机科…