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

JVM跨代引用垃圾回收

1. 跨代引用概述

在Java堆内存中,年轻代和老年代之间存在的对象相互引用,假设现在要进行一次新生代的YGC,但新生代中的对象可能被老年代所引用的,为了找到新生代中的存活对象,不得不遍历整个老年代。这样明显效率很低下,那么如何快速识别并回收这种引用对象呢?

图片

这就不得不提到Card Table(卡表)和 Remember Set(记忆集,简称RSet)了。

2. 跨代引用的处理方式

2.1 卡表(Card Table)

卡表是一种用于跟踪年轻代对象被老年代对象引用的数据结构。它将堆内存划分为一系列固定大小的区域(卡片),每个卡片记录了年轻代对象被老年代对象引用的情况。在老年代垃圾回收时,垃圾收集器会扫描卡表,以确定哪些年轻代对象是存活的,即被老年代对象引用。

图片

在 JVM 中,一个 card 的大小(通常是)512字节。在多线程并行收集时,每个线程可以批量扫描多个 card,一批 card 被称为一个 stride。默认一个 stride 含有 256个 card,即每个线程要每次扫描 512 * 256 = 128 K 的内存区域。stride数量太多就会导致线程在stride之间切换的开销增加,进而导致 GC Pause 增长, strides 太少恐怕也会导致单次扫描的时间增长,进而影响整个 GC Pause 。

2.2 记忆集(Remembered Sets)

伴随 G1 垃圾收集器的诞生,传统的老年代和新生代都从物理上的连续空间,变成了一个个物理上不连续的空间 region

JVM 针对这些Region 提供了一个数据结构,也就是 CSet(Collection Set),存储任意年代的region

物理上不连续的 region 造成了新生代和老年的引用破碎化,新生代引用老年代,所以产生了 old->youngyoung->old的跨代对象引用,这时候 JVM 只要扫描 CSet 中的 R Set 即可。

逻辑上说每个Region都有一个RSet,RSet记录了其他Region中的对象引用本Region中对象的关系。

每个Region会在自身的Remembered Set中纪录下来自其他Region的指向自身的Card位置。这个Remembered Set是一个Hash Table,Key是别的Region的起始地址,Value是一个集合,里面的元素是Card Table的Index。

RSet、Card和Region的关系

下图表示了RSet、Card和Region的关系: 

图片

图中是相互引用的三个region。R1 和 R3 的被细分到了card table 级别。R2 被 R1 和 R3的某些区域引用,所以 R2 的 RSet 会记录到 R1 和 R2 的区域索引,即产生某些循环引用的作用。

一个 Region 的 RSet 如果有值,至少可以证明这个区域是有引用的;一个区域如果无值,则可以认为这个区域不可达,可以不扫描这个区域(Card Table 可以减少 Minor GC 扫描 old 区来理解 young 区的时间,RSet 则可以减少扫描生成 CSet 选取候选 region 的时间)。

在做YGC的时候,只需要选定young generation region的RSet作为根集,这些RSet记录了old->young的跨代引用,避免了扫描整个old generation。而mixed gc的时候,old generation中记录了old->old的 RSet,young->old的引用由扫描全部young generation region(的 card table)得到,这样也不用扫描全部old generation region。所以RSet的引入大大减少了GC的工作量。

2.3 处理器屏障(Processor Barriers)

处理器屏障是一种硬件支持的机制,用于跟踪对象之间的引用关系。当发生引用修改时,处理器屏障可以监测到对内存的访问,并通知垃圾收集器。垃圾收集器可以根据这些信息来更新引用关系,确保跨代引用被正确处理。

3. 总结

卡表只解决 youngGC 扫老年代的问题,而 RSet 则解决了(G1 对)所有 Region 的扫描问题。卡表通过对外引用提示我们应该扫描什么区域,这样我们可以避开不用扫描的区域;RSet通过对内引用提示我们应该扫描什么区域,这样我们可以避开不用扫描的区域。

跨代引用的垃圾回收是Java虚拟机中一个复杂而重要的问题。通过合理设计和优化记忆集、卡表等数据结构,并结合并发标记-清除算法、处理器屏障等技术,可以有效地处理跨代引用,保证垃圾回收的效率和稳定性,从而提高Java应用程序的性能和可靠性。

相关文章:

JVM跨代引用垃圾回收

1. 跨代引用概述 在Java堆内存中,年轻代和老年代之间存在的对象相互引用,假设现在要进行一次新生代的YGC,但新生代中的对象可能被老年代所引用的,为了找到新生代中的存活对象,不得不遍历整个老年代。这样明显效率很低…...

AI:135-基于卷积神经网络的艺术品瑕疵检测与修复

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…...

C++标准头文件汇总及功能说明

文章目录 algorithmbitsetcctypecerrnoclocalecmathcstdioctimedequeiostreamexceptionfstreamfunctionallimitslistmapiosiosfwdsetsstreamstackstdexceptstreambufcstringutilityvectorcwcharcwctype algorithm algorithm头文件是C的标准算法库,它主要用在容器上。…...

glTF 添加数据属性(extras)

使用3D 模型作为可视化界面的一个关键是要能够在3D模型中添加额外的数据属性,利用这些数据属性能够与后台的信息模型建立对应关系,例如后台信息模型是opcua 信息模型的话,在3D模型中要能够包含OPC UA 的NodeId,BrowserName 等基本…...

linux系统消息中间件rabbitmq普通集群的部署

rabbitmq普通集群的部署 普通集群准备环境查询版本对应安装rabbitmq软件启动创建登录用户开启用户远程登录查看端口 部署集群创建数据存放目录和日志存放目录:拷⻉erlang.cookie将其他两台服务器作为节点加⼊节点集群中查看集群状态创建新的队列 普通集群准备环境 配置hosts⽂件…...

TextCNN:文本分类卷积神经网络

模型原理 1、前言2、模型结构3、示例3.1、词向量层3.2、卷积层3.3、最大池化层3.4、Fully Connected层 4、总结 1、前言 TextCNN 来源于《Convolutional Neural Networks for Sentence Classification》发表于2014年,是一个经典的模型,Yoon Kim将卷积神…...

欧几里得和《几何原本》

欧几里得和《几何原本》 欧几里得(Euclid),公元前约300年生于古希腊,被认为是几何学的奠基人之一。他的主要成就是编写了一本名为《几何原本》(Elements)的著作,这本书成为了几何学的经典教材&a…...

linux c++ 开发 tensorrt 安装

tensorrt 官方下载地址(需要注册账号登录):Log in | NVIDIA Developer 根据系统发行版和CUDA版本 (nvcc -V) 选择合适的安装包 EA(early access)版本代表抢先体验。 GA(general availability)代…...

Redis高并发分布锁实战

Redis高并发分布锁实战 问题场景 场景一: 没有捕获异常 // 仅仅加锁 // 读取 stock15 Boolean ret stringRedisTemplate.opsForValue().setIfAbsent("lock_key", "1"); // jedis.setnx(k,v) // TODO 业务代码 stock-- stringRedisTemplate.delete(&quo…...

Kotlin基础——DSL

DSL(领域特定语言) 常见的DSL就是SQL和正则表达式,用于操作数据库和文本字符串,Kotlin DSL通常为嵌套的Lambda表达式或链式方法,如 https://github.com/gradle/gradle-script-kotlin 用于构建Gradle脚本https://gith…...

《Docker 简易速速上手小册》第4章 Docker 容器管理(2024 最新版)

文章目录 4.1 容器生命周期管理4.1.1 重点基础知识4.1.2 重点案例:启动并管理 Python Flask 应用容器4.1.3 拓展案例 1:调试运行中的容器4.1.4 拓展案例 2:优雅地停止和清理容器 4.2 容器数据管理与持久化4.2.1 重点基础知识4.2.2 重点案例&a…...

【人脸朝向识别与分类预测】基于PNN神经网络

课题名称:基于PNN神经网络的人脸朝向识别分类 版本日期:2024-02-20 运行方式:直接运行PNN0503.m文件 代码获取方式:私信博主或 QQ:491052175 模型描述: 采集到一组人脸朝向不同角度时的图像,图像来自不…...

【Python笔记-设计模式】组合模式

一、说明 组合模式是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们。 (一) 解决问题 处理树形结构:可以很好地处理树形结构的数据,使得用户可以统一对待单个对象和对象组合。统一接…...

51单片机学习(5)-----蜂鸣器的介绍与使用

前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步。 目录 一. 蜂鸣器的介绍 1.蜂鸣器介绍 2.压电式蜂鸣器 (无源…...

-bash: /root/.ssh/authorized_keys: Read-only file system

问题背景 由于跳板机不支持 ssh-copy-id 命令&#xff0c;为了配置免密登录&#xff0c;考虑在服务器上手动使用 cat 命令写入跳板机公钥 cat <<EOL >> ~/.ssh/authorized_keys [Your public key] EOL但却出现了以下错误 -bash: /root/.ssh/authorized_keys: Re…...

3,设备无关位图显示

建立了一个类Dib Dib.h #pragma once #include “afx.h” class CDib :public CObject { public: CDib(); ~CDib(); char* GetFileName(); BOOL IsValid(); DWORD GetSize(); UINT GetWidth(); UINT GetHeight(); UINT GetNumberOfColors(); RGBQUAD* GetRGB(); BYTE* GetDat…...

转前端了!!

大家好&#xff0c;我是冰河~~ 没错&#xff0c;为了更好的设计和开发分布式IM即时通讯系统&#xff0c;也为了让大家能够直观的体验到分布式IM即时通讯系统的功能&#xff0c;冰河开始转战前端了。也就是说&#xff0c;整个项目从需求立项到产品设计&#xff0c;从架构设计到…...

RESTful API如何使用它构建 web 应用程序。

链接&#xff1a;华为机考原题 RESTful API(Representational State Transfer)是一种基于网络的软件架构风格&#xff0c;用于设计和访问网络资源。它是一种轻量级、灵活、可扩展的架构&#xff0c;常用于构建Web应用程序和服务。 使用RESTful API构建Web应用程序的步骤如下&…...

现在学Oracle是49年入国军么?

今天周末&#xff0c;不聊技术&#xff0c;聊聊大家说的最多的一个话题 先说明一下&#xff0c;防止挨喷&#x1f606; 本人并不是职业dba&#xff0c;对数据库就是爱好&#xff0c;偶尔兼职&#xff0c;以下仅个人观点分析&#xff0c;如有不同观点请轻喷&#xff0c;哈哈&…...

【回溯】组合问题||

给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含重复的组合。 示例 1: 输入: candidates [10,1,2,7,6,…...

从IMU到GPS:手把手教你用ESKF实现机器人定位(附代码避坑指南)

从IMU到GPS&#xff1a;手把手教你用ESKF实现机器人定位&#xff08;附代码避坑指南&#xff09; 在机器人定位领域&#xff0c;误差状态卡尔曼滤波&#xff08;Error-State Kalman Filter, ESKF&#xff09;正逐渐成为处理IMU和GPS数据融合的主流方法。本文将带您深入理解ESK…...

射频非线性建模:从S参数到X参数与NVNA的工程实践

1. 非线性星期三&#xff1a;一场射频工程师的“大信号”狂欢如果你是一名射频或微波电路设计工程师&#xff0c;对S参数、负载牵引、谐波失真这些词感到既熟悉又头疼&#xff0c;那么十多年前在巴尔的摩举行的国际微波研讨会&#xff08;IMS 2011&#xff09;上&#xff0c;有…...

一文搞懂JTT1078:车载视频监控协议科普+开发入门

之前聊过JTT808&#xff0c;很多朋友私信问我&#xff0c;车载监控里的视频画面、语音对讲靠什么实现的&#xff1f;答案很简单——JTT1078协议。如果说JTT808是车载监控的“骨架”&#xff0c;负责定位和基础状态传输&#xff0c;那JTT1078就是“神经”&#xff0c;专门管音视…...

OpenClaw近一月版本更替讲解

如果你最近没追 OpenClaw 的更新&#xff0c;最容易产生一种错觉&#xff1a;它是不是又只是多接了几个模型、多加了几个花哨功能&#xff1f; 我看完最近一个月的变化后&#xff0c;感觉不是这样。 OpenClaw 这一个月真正值得关注的地方&#xff0c;不是“它更炫了”&#xff…...

2018自动化测试核心价值与行业挑战解析

1. 2018自动化测试的核心价值与行业挑战在2018年这个技术转折点上&#xff0c;自动化测试已经从可选方案变成了工程团队的生存必需。作为经历过这个阶段的测试架构师&#xff0c;我亲眼见证了当时几个关键行业变化&#xff1a;5G标准竞赛进入白热化阶段、自动驾驶汽车传感器技术…...

用电脑自动玩小红书,OpenClaw+ADB让效率翻倍!附详细教程“

本文介绍了如何使用OpenClaw&#xff08;运行在MacOS上&#xff09;结合ADB工具实现Android手机的自动化操作。内容涵盖Android手机配置&#xff08;开启开发者选项和USB调试&#xff09;、MacOS环境准备&#xff08;安装ADB工具和配置ADBKeyboard支持中文输入&#xff09;&…...

电子显微镜波传递函数与Ptychographic重建技术解析

1. 电子显微成像中的波传递函数解析 波传递函数&#xff08;Wave Transfer Function, WTF&#xff09;是理解电子显微镜成像机制的核心数学工具。这个复数值函数描述了电子波与样品相互作用后&#xff0c;在空间频率域中的相位和振幅变化情况。在透射电子显微镜&#xff08;TEM…...

Linux服务器远程桌面实战:xrdp配置与Windows无缝连接指南

1. 为什么需要xrdp远程桌面&#xff1f; 刚接触Linux服务器的朋友经常会问我一个问题&#xff1a;"能不能像Windows那样直接用远程桌面连接&#xff1f;"说实话&#xff0c;我第一次管理Linux服务器时也有同样的困惑。毕竟对于习惯了Windows图形界面的用户来说&#…...

超声引导手术中的‘呼吸’难题:我们如何用体外标记法搞定肝部超声-CT的实时配准?

超声与CT影像实时配准&#xff1a;破解呼吸运动干扰的临床实战方案 在肝癌射频消融或穿刺活检手术中&#xff0c;影像引导的精准度直接决定治疗效果。超声凭借其实时性成为首选引导工具&#xff0c;但图像质量局限常需与高分辨率的CT影像融合。这一过程中&#xff0c;呼吸运动导…...

智慧港口高风险作业AI实时监督技术实操解析

在智慧港口建设中&#xff0c;集装箱堆场、高风险作业的安全管控是核心重点&#xff0c;其中皮带运输、高风险作业&#xff08;吊装、动火、高处、有限空间等&#xff09;的安全保障&#xff0c;是港口运维的关键。当前&#xff0c;港口高风险作业普遍面临痛点&#xff1a;人工…...