JVM G1内存管理核心概念解析:Region、Card Table、CSet与RSet

news/2025/3/20 5:38:48/
一、Region(堆分区)

定义:Region是G1垃圾回收器中内存管理的最小单元,将传统连续堆划分为多个独立区域(默认2048个),每个大小在1MB-32MB之间,支持动态调整。

核心特性

  1. 分区类型
    • 新生代Region:包含Eden和Survivor区,占堆总空间的5%-60%。
    • 老年代Region:存放长期存活对象,物理上无需与新生代连续。
    • 大对象Region(HHR):存储超过Region容量50%的大对象,通过连续多个Region存放。
  2. 优化设计
    • 动态调整:根据堆大小自动计算Region尺寸(如32GB堆对应16MB/Region)。
    • 效率平衡:过大的Region会延长回收时间,过小则降低内存利用率,默认以2048个分区为目标。

二、Card Table(卡表)

作用:解决跨代引用扫描效率问题,标记老年代中指向新生代对象的引用位置,避免YGC时全量扫描老年代。

实现机制

  1. 数据结构
    • 将老年代内存划分为512字节的块(Card),使用位图(BitMap)标记脏卡(Dirty Card)。
    • 例如,一个4GB老年代对应约800万张卡,仅需约1MB存储位图。
  2. 写屏障维护
    • 当老年代对象引用新生代对象时,触发写屏障将对应Card标记为Dirty,YGC时仅扫描Dirty Card。

三、CSet(Collection Set,回收集合)

定义:G1垃圾回收中待回收的Region集合,通过动态筛选实现高效回收。

核心规则

  1. 组成策略
    • 新生代回收:包含所有Eden和Survivor Region。
    • 混合回收:加入高垃圾比例的老年代Region(默认回收占比超85%的Region)。
  2. 优先级算法
    • 基于回收价值模型(回收时间与释放空间比),优先选择性价比高的Region加入CSet。
    • 例如,回收耗时5ms释放20MB的Region,优先级高于耗时10ms释放15MB的Region。

四、RSet(Remembered Set,记忆集)

作用:记录跨Region引用关系,避免全局扫描,提升回收效率。

技术细节

  1. 数据结构
    • 每个Region维护独立RSet,存储其他Region指向本Region的引用指针。
    • 采用哈希表或指针数组实现,如引用数量较少时用数组,较多时切换为哈希结构。
  2. 维护机制
    • 写屏障触发:当对象A(Region X)引用对象B(Region Y)时,更新Y的RSet记录X的信息。
    • 并行处理:G1通过并发线程批量处理RSet更新,减少对业务线程的影响。

五、协同工作流程示例

以一次G1混合回收为例:

  1. 标记阶段:通过RSet快速定位跨Region引用,结合Card Table筛选存活对象。
  2. 筛选CSet:根据回收价值模型选择Eden、Survivor和部分老年代Region。
  3. 转移阶段:将存活对象复制到空闲Region,同时更新RSet和Card Table。
  4. 清理阶段:清空原Region并加入空闲队列,RSet和Card Table重置。

总结

  • Region是G1内存管理的基础单元,实现堆空间精细化划分。
  • Card Table优化跨代引用处理,RSet解决跨Region引用跟踪,两者共同减少扫描范围。
  • CSet通过动态策略提升回收效率,四者协同实现G1低延迟、高吞吐的目标。

http://www.ppmy.cn/news/1580513.html

相关文章

如何判断 MSF 的 Payload 是 Staged 还是 Stageless(含 Meterpreter 与普通 Shell 对比)

在渗透测试领域,Metasploit Framework(MSF)的 msfvenom 工具是生成 Payload(载荷)的核心利器。然而,当我们选择 Payload 时,经常会遇到一个问题:这个 Payload 是 Staged(…

学习单片机需要多长时间才能进行简单的项目开发?

之前有老铁问我,学单片机到底要多久,才能进行简单的项目开发?是三个月速成,还是三年磨一剑? 今天咱们就来聊聊这个话题,我不是什么高高在上的专家,就是个踩过无数坑、烧过几块板子的“技术老友”…

从PLC到云端:5G嵌入式网关的MQTT协议转换与Ubuntu二次开发全解析

工业4.0和物联网技术的发展推动了5G嵌入式ARM边缘计算网关在工业自动化领域的广泛应用。这种网关不仅能够支持多种协议的数据采集,例如西门子PLC Smart 200,还能够通过MQTT协议高效传输数据至自建云平台,如EMQX。此外,基于Ubuntu系…

【开源免费】基于SpringBoot+Vue.JS失物招领平台(JAVA毕业设计)

本文项目编号 T 243 ,文末自助获取源码 \color{red}{T243,文末自助获取源码} T243,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

python二级每日十题(1)

\ 第一题,在Python中,变量名的命名规则:以字母或下划线开头,后面跟字母、下划线和数字;不能以数字开头.故选c项,博主正确 缩进:在逻辑行首的空白(空格和制表符)用来决定逻辑行的缩进层次&…

NO.42十六届蓝桥杯备战|数据结构|算法|时间复杂度|空间复杂度|STL(C++)

数据结构 什么是数据结构 在计算机科学中,数据结构是⼀种数据组织、管理和存储的格式。它是相互之间存在⼀种或多种特定关系的数据元素的集合。 说点通俗易懂的话,数据结构就是数据的组织形式,研究的就是把数据按照何种形式存储在计算机中 …

K8S-etcd服务无法启动问题排查

一、环境、版本信息说明 k8s:v1.19.16 etcdctl version: 3.5.1 3台etcd(10.xxx.xx.129、10.xxx.xx.130、10.xxx.xx.131)组成的集群。 二、问题根因 129节点的etcd数据与其他两台数据不一致,集群一致性校验出错导致无法加入集…

RabbitMQ常见问题总结

RabbitMQ 是什么? RabbitMQ 是一个在 AMQP(Advanced Message Queuing Protocol )基础上实现的,可复用的企业消息系统。它可以用于大型软件系统各个模块之间的高效通信,支持高并发,支持可扩展。它支持多种客…