大概了解一下G1收集器

在上一篇文章中(链接:大概了解一下CMS收集器)我们提到,CMS是一种主要针对旧生代对象进行回收的收集器。与CMS不同,G1号称“全功能的垃圾收集器”,对初生代内存和旧生代内存均进行管理。鉴于此,这里先简单插入介绍一下HotSpot虚拟机对于初生代内存的管理方式。

初生代内存管理

在HotSpot虚拟机中,初生代分为两个部分:Eden区和Survivor区,其中Survivor区又会被分为From区和To区,三者的比例通常为8:1:1。
在这里插入图片描述

初生代的对象并不会在一次GC后立刻被转移到旧生代,而是需要经过一定次数的初生代GC后才会晋升,这个次数我们可以称之为年龄。

将Survivor区划分为From和To的意图就很明显了,记得我们上文说到的“标记清除三兄贵”么,这不就是其中的标记复制算法嘛。

  • To区作为备用内存区
  • From区中的对象会在GC中进行遍历标记,标记结束进入清除阶段后,对于存活的对象,如果没有达到年龄,就被复制到To区,如果达到要求的年龄,就晋升到旧生代。
  • Eden区是创建新对象时默认的区域,也就是说Eden区中都是新创建的对象,之所以Eden区要比Survivor区大很多,也是基于一个假设:大部分新建对象的生命周期都很短,可以被很快回收。
  • Eden区的对象如果在GC中存活下来,认为一定达不到晋升所需的年龄,因此不需要像From中的对象一样计算年龄,直接复制到To区。
  • 之后清空Eden区和From区。
  • 最后将From区和To区交换。
    在这里插入图片描述
    在这里插入图片描述

比如上图这种情况:

  • 对象A和E在GC中存活下来,E没有达到要求的年龄,移动到To区,A是Eden区中的对象,直接移动到To区
  • 对象B和D没有在GC中存活下来,清除
  • 对象C在GC中存活下来,且达到要求的年龄,晋升到旧生代

移动后的情况如下:
在这里插入图片描述
最后将From和To交换:
在这里插入图片描述

G1(Garbage First)

在下面这两篇文章中我们已经介绍过分代GC中常用的一些概念(包括Region),本文就不再赘述。
分代GC前置概念(一):Card Table 和 Remembered Set
分代GC前置概念(二):TLAB

在G1中,内存仍然被分成初生代(包括Eden和Survivor)和旧生代,但与老的内存管理方式不同:

  • G1中每一部分的内存都是由多个Region组成的,因此只是逻辑上连续,并不需要物理上连续
  • G1中每一部分的内存大小是不固定的,会动态调整
  • G1中可以手动设置期望的GC时长,当然这只是个期望值,但G1会根据这个期望值动态的选择实际触发GC还是分配更多的空闲Region给当前代际
  • G1还会根据设置的期望值,动态决定对哪些Region进行实际回收,以使效率最高用时最少,计算得到的Region集合,被称为CSet。

在这里插入图片描述

初生代GC(Young GC)

g1源码之youngGC技术细节探究

当新创建小对象时默认将其分配在新生代的Eden区中(大对象在Humongous区,跟随旧生代处理,这里不讨论),当Eden没有足够空间时,G1会根据上文所说的期望时间与当前Region的使用情况,决定此时是给Eden区分配更多的可用Region还是触发一次Young GC:

  • Young GC只针对初生代进行
  • Young GC是全程STW的
  • Young GC的CSet包含所有初生代Region,也即整个初生代都在Young GC的回收范围内

Young GC几个主要过程:

  • STW——全程STW,没什么可说的。
  • 收集CSet——整个初生代区域。
  • 根扫描——从ROOT出发进行扫描。
  • 更新RSet——前文曾提到过,RSet的更新并不是实时的,因此在GC开始时,RSet可能并非最新,因此需要先将RSet更新到最新。
  • 扫描Rset——从RSet出发进行扫描。
  • 复制对象——将存活对象复制到对应的Region中(可能是Survivor,也可能是Old)。
  • 重构RSet——由于存活对象所在的Region发生了变化,需要对RSet进行重构。

混合GC(Mixed GC)

Mixed GC 针对的目标既包括初生代也包括旧生代,但对于旧生代,G1只对其中的一部分进行回收,也即Mixed GC的CSet包括了所有初生代Region和部分旧生代Region,这也是为了尽量使G1的耗时满足用户手动设置的期望值。

Mixed GC的触发时机为旧生代内存占整堆达到一定比例时(IHOP——InitiatingHeapOccupancyPercent)。之所以Mixed GC不像Young GC一样在内存耗尽时才触发,是因为当达到IHOP时,并非立刻开始一个严格完整的GC过程,而仅仅是将Mixed GC切换到了激活状态。在这之后,仍然会进行Young GC,此时Young GC会承担起一部分与Mixed GC重合的工作,从而为Mixed GC分担耗时。

在这里插入图片描述

如上图所示,Mixed GC的过程基本可以分为如下阶段:

初始标记

  • 当Mixed GC处于激活状态时,仍然会进行Young GC,以此来完成对初生代的处理
  • 当Mixed GC处于激活状态时,Young GC还会承担起对于与之相关的部分旧生代对象的标记工作,从而减少后续针对旧生代进行扫描的工作量
  • 由于Young GC是全程STW的,所以此阶段也为STW的

根扫描

  • 扫描ROOT对旧生代的引用
  • 此过程可与业务线程并发
  • 此过程可以被新触发的Young GC打断

并发标记

  • 扫描整个堆进行标记
  • 此过程可与业务线程并发
  • 此过程可以被新触发的Young GC打断

重标记

  • 与CMS的重标记阶段作用一样,但是通过初始快照(SATB——Snapshot At The Beginning)机制实现。
  • SATB简单理解为在GC开始时,根据对象内存地址进行粗略的划分,处于一定地址范围内的对象都被认为是本次需要关注的活跃对象,从而形成一份简单的内存快照。在上述的两个并发过程中,如果活跃对象的引用发生变化时,则进行记录。当并发标记结束后,对SATB记录的发生变化的对象进行重新标记。
  • SATB关注的是引用断开,即基于“删除写屏障”机制。 此过程为STW的

清理

  • 计算Region的回收价值(STW)
  • 清除RSet(STW)
  • 按照回收价值对Region进行清理(并发执行)。

复制

  • 将一些占用率过低的Region进行合并,对其中的对象进行复制/移动操作。
  • 此过程为STW的

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

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

相关文章

pyspark分布式部署随机森林算法

前言 分布式算法的文章我早就想写了,但是一直比较忙,没有写,最近一个项目又用到了,就记录一下运用Spark部署机器学习分类算法-随机森林的记录过程,写了一个demo。 基于pyspark的随机森林算法预测客户 本次实验采用的…

成功解决ModuleNotFoundError: No module named ‘cv2’

🔥 成功解决ModuleNotFoundError: No module named ‘cv2’ 🔥 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 …

中间件-Nginx漏洞整改(限制IP访问隐藏nginx版本信息)

中间件-Nginx漏洞整改(限制IP访问&隐藏nginx版本信息) 一、限制IP访问1.1 配置Nginx的ACL1.2 重载Nginx配置1.3 验证结果 二、隐藏nginx版本信息2.1 打开Nginx配置文件2.2 隐藏Nginx版本信息2.3 保存并重新加载Nginx配置2.4 验证结果2.5 验证隐藏版本…

ubuntu20.04安装和使用 Maldet (Linux Malware Detect)

1、下载 Maldet sudo wget http://www.rfxn.com/downloads/maldetect-current.tar.gz 2、解压Maldet sudo tar -xvf maldetect-current.tar.gz 3、进入到Maldet目录,然后运行安装脚本 sudo ./install.sh 4、安装ClamAV sudo apt-get update sudo apt-get in…

Jenkins 中针对视图分组(11)

一、将没有在视图的项目进行归纳操作; 新增的项目规则,并入到某就一个视图中,但常规是设置一个规则,后续按照规则走,就不用单独设置 1、首先到控制台页面,如果没有视图分组就点击加号新增;已存在…

JavaScript异步编程

回调地狱 回调地狱是一种由于过度使用嵌套回调函数而导致的代码结构不清晰、难以理解和维护的问题。一个典型例子是嵌套多个回调函数,每个回调函数都作为另一个回调函数的参数。这样会导致各个部分之间高度耦合、程序结构混乱、流程难以追踪,每个任务只能…

详解顺序结构滑动窗口处理算法

🎀个人主页: https://zhangxiaoshu.blog.csdn.net 📢欢迎大家:关注🔍点赞👍评论📝收藏⭐️,如有错误敬请指正! 💕未来很长,值得我们全力奔赴更美好的生活&…

性能优化问题思考总结

INP 是什么? Interaction to Next Paint (INP) INP是一项指标,通过观察用户在访问网页期间发生的所有点击、点按和键盘互动的延迟时间,评估网页对用户互动的总体响应情况。 互动是指在同一逻辑用户手势期间触发的一组事件处理脚本。例如&a…

龙蜥OS 尝试

> 尝试一下龙蜥OS,和Centos8应该没什么区别。 阿里云版本龙蜥 https://alinux3.oss-cn-hangzhou.aliyuncs.com/aliyun_3_x64_20G_nocloud_alibase_20230727.vhd Index of /anolis/8.8/isos/GA/x86_64/ (openanolis.cn) 网卡 我在虚拟机上安装完后,…

SpringBoot使用classfinal-maven-plugin插件加密Jar包

jar包加密 1、在启动类的pom.xml中加入classfinal-maven-plugin插件 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><…

算法沉淀——动态规划之子数组、子串系列(上)(leetcode真题剖析)

算法沉淀——动态规划之子数组、子串系列 01.最大子数组和02.环形子数组的最大和03.乘积最大子数组04.乘积为正数的最长子数组长度 01.最大子数组和 题目链接&#xff1a;https://leetcode.cn/problems/maximum-subarray/、 给你一个整数数组 nums &#xff0c;请你找出一个具…

计算机设计大赛 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的行人重识别算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c…

vue3使用elementPlus进行table合并处理

elementPlus中table合并部分列 虚拟数据中公司下有多个客户&#xff0c;公司一样的客户&#xff0c;公司列需要合并&#xff0c;客户如果一样也需要合并进行展示&#xff0c;效果展示 const tableData ref([])自定定义自已想要的数据&#xff0c;一般都是通过接口拿到 //table…

ubuntu+QT+ OpenGL环境搭建和绘图

一&#xff0c;安装OpenGL库 安装OpenGL依赖项&#xff1a;运行sudo apt install libgl1-mesa-glx命令安装OpenGL所需的一些依赖项。 安装OpenGL头文件&#xff1a;运行sudo apt install libgl1-mesa-dev命令来安装OpenGL的头文件。 安装GLUT库&#xff1a;GLUT&#xff08;Ope…

亚马逊巨头都在用的自养号大法,赶快get!

随着时间的推移&#xff0c;越来越多做亚马逊生意的朋友开始意识到自养号的重要性。拥有自养号意味着掌握了一手资源&#xff0c;这种自主性让人感到更安全。高权重的买家号可以享有更多的操作权限&#xff0c;也能获得更好的效果。然而&#xff0c;要想成功地养好自养号并不是…

Netty权威指南——基础篇2(NIO编程)

1 概述 与Socket类和ServerSocket&#xff0c;NIO也提供了SocketChannel和ServerSocketChannel两种不同的套接字通道实现。这两种新增的通道都支持阻塞和非阻塞两种模式。阻塞模式使用简单&#xff0c;但性能和可靠性都不好&#xff0c;非阻塞模式则正好相反。一般来说&#xf…

python Matplotlib Tkinter-->导出pdf报表

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 reportlab 4.0.9 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk import tkinter.messagebox as messagebox impor…

46.仿简道云公式函数实战-文本函数-CHAR

1. CHAR函数 函数可将计算机其他类型的数字代码转换为字符。 2. 函数用法 CHAR(number) CHAR 函数可将计算机其他类型的数字代码转换为字符。 Number&#xff1a;用于指定字符的数字。 3. 函数示例 CHAR(10)&#xff0c;即返回值为换行字符"\n"。 目前仿简道…

电脑背景图片怎么设置?这个方法让你一目了然

电脑背景图片的设置是个性化电脑桌面的重要步骤之一。一张美观的背景图片不仅可以为电脑带来视觉愉悦&#xff0c;还能反映个人品味和风格。在本文中&#xff0c;我们将介绍电脑背景图片的设置方法&#xff0c;共包括三种方式&#xff0c;通过分步骤详细说明&#xff0c;帮助用…

解决Maven爆红以及解决 Idea 卡在 Resolving问题

关于 Idea 卡在 Resolving&#xff08;前提是Maven的setting.xml中配置好了阿里云和仓库&#xff09; 参考文章https://blog.csdn.net/jiangyu1013/article/details/95042611 解决Maven爆红参考文章https://devpress.csdn.net/beijing/656d993b76f0791b6eca7bb0.html?dp_toke…