大概了解一下G1收集器

2024-02-26 20:20

本文主要是介绍大概了解一下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的

这篇关于大概了解一下G1收集器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/750058

相关文章

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

HotSpot虚拟机的经典垃圾收集器

读《深入理解Java虚拟机》第三版笔记。 关系 Serial、ParNew、Parallel Scavenge、Parallel Old、Serial Old(MSC)、Concurrent Mark Sweep (CMS)、Garbage First(G1)收集器。 如图: 1、Serial 和 Serial Old 收集器 2、ParNew 收集器 3、Parallel Sc

【详细介绍一下GEE】

GEE(Google Earth Engine)是一个强大的云计算平台,它允许用户处理和分析大规模的地球科学数据集,如卫星图像、气候模型输出等。以下是对GEE用法的详细介绍: 一、平台访问与账户设置 访问GEE平台: 用户可以通过访问Google Earth Engine的官方网站来开始使用GEE。 创建账户: 用户需要注册并登录Google账户,然后申请访问GEE平台。申请过程可能需要提

PHP: 深入了解一致性哈希

前言 随着memcache、redis以及其它一些内存K/V数据库的流行,一致性哈希也越来越被开发者所了解。因为这些内存K/V数据库大多不提供分布式支持(本文以redis为例),所以如果要提供多台redis server来提供服务的话,就需要解决如何将数据分散到redis server,并且在增减redis server时如何最大化的不令数据重新分布,这将是本文讨论的范畴。 取模算法 取模运

Weex入门教程之1,了解Weex

【资料合集】Weex Conf回顾集锦:讲义PDF+活动视频! PDF分享:链接:http://pan.baidu.com/s/1hr8RniG 密码:fa3j 官方教程:https://weex-project.io/cn/v-0.10/guide/index.html 用意 主要是介绍Weex,并未涉及开发方面,好让我们开始开发之前充分地了解Weex到底是个什么。 以下描述主要摘取于

Java了解相对较多!

我是对Java了解相对较多,而对C#则是因工作需要才去看了一下,C#跟Java在语法上非常相似,而最初让我比较困惑的就是委托、事件部分,相信大多数初学者也有类似的困惑。经过跟Java的对比学习,发现这其实跟Java的监听、事件是等同的,只是表述上不同罢了。   委托+事件是观察者模式的一个典型例子,所谓的委托其实就是观察者,它会关心某种事件,一旦这种事件被触发,这个观察者就会行动。   下

使用WebP解决网站加载速度问题,这些细节你需要了解

说到网页的图片格式,大家最常想到的可能是JPEG、PNG,毕竟这些老牌格式陪伴我们这么多年。然而,近几年,有一个格式悄悄崭露头角,那就是WebP。很多人可能听说过,但到底它好在哪?你的网站或者项目是不是也应该用WebP呢?别着急,今天咱们就来好好聊聊WebP这个图片格式的前世今生,以及它值不值得你花时间去用。 为什么会有WebP? 你有没有遇到过这样的情况?网页加载特别慢,尤其是那

初步了解VTK装配体

VTK还不太了解,根据资料, vtk.vtkAssembly 是 VTK库中的一个重要类,允许通过将多个vtkActor对象组合在一起来创建复杂的3D模型。 import vtkimport mathfrom vtk.util.colors import *filenames = ["cylinder.stl","sphere.stl","torus.stl"]dt = 1.0renW