HotSpot的算法细节

可达性分析算法

以一系列“GC Roots”根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连, 或者用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的。

从GC Roots开始向下进行引用搜索,如果某对象和任何GC Root没有关联,则认为该对象不再被使用。

GC Roots

  • 虚拟机栈中引用的对象,对应虚拟机方法栈中当前执行的方法所使用的参数,局部变量,临时变量等。
  • 方法区中:类的静态变量,常量
  • 本地方法栈中引用的对象

记忆集与卡表

记忆集是一种用于记录从非收集区域指向收集区域的指针集合的抽象数据结构。

卡表:是记忆集的一种实现形式,采用的是“卡精度”的方式实现记忆集。卡精度指精确到一块内存区域(该内存区域又称为“卡页”),这个区域内有跨代指针的话,就将其标识出来(实际是使用的0/1标识);

在进行GCROOTS扫描时,同时再去筛选卡表中变脏的元素(扫描指定的内存区域块),可以快速定位到关联区域,将跨区引用的对象一起加入GCROOTS扫描。

写屏障

写屏障主要解决的是卡表元素的维护更新,即处理卡表变脏的问题。

何时变脏:其他分代区域有对象引用了该区域对象时,其对应的卡表元素则变脏。

写屏障的处理类似于一个AOP切面,即在本区对象被引用时,添加了Around环绕通知,可在引用赋值前后添加写前屏障和写后屏障。通常虚拟机在写后屏障中增加维护卡表的操作。

卡表在高并发场景下还存在伪共享的问题,由于64个卡表共享一个缓存行,当多个线程更新同一缓存行数据时,会出现并发更新影响性能的情况。

同时虚拟机提供-XX:+UseCondCardMark参数配置,开启该参数则会预先检查该卡表是否已变脏,再行更新的策略。对未变脏的进行更新,已经变脏的卡表不再更新。开启该参数增加异常额外判断的开销,但可以避免伪共享的问题

SATB(snapshot at the beginning)原始快照

沿着GCRoots进行并发扫描时,通常用户线程也在并发执行。这时会面临着已经被垃圾收集器扫描的对象图被用户线程更改的情况。

情况一:某些对象被用户线程断开了引用,其实该对象已经成为垃圾,现在仍被垃圾收集器标识为存活

情况二:某些被垃圾收集器标识为垃圾的对象被用户线程重新引用,导致存活对象被垃圾收集器回收了

综合以上两种情况可知,情况一其实可以容忍,只是程序产生了一些浮动垃圾,待下一次垃圾收集时可以一并回收。情况二把原本存活的对象标记为了死亡,则会造成程序的致命错误。

关于情况二即并发扫描时的对象消失问题,不同的垃圾收集器的解决办法不同。CMS中使用增量更新的方式,G1和shenandoah采用原始快照的方式。

CMS使用增量更新的方式:

当有黑色对象插入指向白色对象的引用时,就将这个引用关系记录下来。在并发扫描结束后(最终标记),以这些黑色对象为根再次进行扫描一次。

垃圾收集器扫描完成的对象引用了一个未被扫描过(新创建或已断开引用)的对象,会将该引用关系记录下来,在最终标记阶段再以该新创建的对象为根,再次进行扫描一次。

G1和shenandoah的原始快照方式:

当灰色对象要删除一个指向白色对象的引用时,就将该要删除引用关系记录下来。在并发扫描结束再以这些灰色对象为根进行扫描一次。这种做法最终导致无论关系删除与否,都会按照垃圾收集器开始扫描的那一刻的对象图来进行对象搜索。

TAMS(Top at mark start)标记顶部

G1收集器中的概念,G1为每个region设计两个TAMS的指针,用于在并发回收阶段新的对象的分配。在回收阶段新对象分配的内存地址将落在region的两个TAMS指针之间。G1默认在两个指针之间的对象是存活的,不对其进行垃圾回收。

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

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

相关文章

Transformer数学推导——Q27 证明时序注意力(Temporal Attention)在视频模型中的帧间依赖建模

该问题归类到Transformer架构问题集——注意力机制——跨模态与多模态。请参考LLM数学推导——Transformer架构问题集。 在视频理解任务中,捕捉帧与帧之间的时间依赖关系(如动作的连贯性、物体的运动轨迹)是核心挑战。时序注意力&#xff08…

服务器和数据库哪一个更重要

在当今数字化的时代,服务器和数据库都是构建和运行各种应用系统的关键组成部分,要说哪一个更重要,其实很难简单地给出定论。 服务器就像是一个强大的引擎,为应用程序提供了稳定的运行环境和高效的计算能力。它负责接收和处理来自…

【Android】四大组件之Service

目录 一、什么是Service 二、启停 Service 三、绑定 Service 四、前台服务 五、远程服务扩展 六、服务保活 七、服务启动方法混用 你可以把Service想象成一个“后台默默打工的工人”。它没有UI界面,默默地在后台干活,比如播放音乐、下载文件、处理…

pytest 技术总结

目录 一 pytest的安装: 二 pytest有三种启动方式: 三 用例规则: 四 配置框架: 一 pytest的安装: pip install pytest # 安装 pip install pytest -U # 升级到最新版 二 pytest有三种启动方式: 1…

redis 有序集合zrange和zrangebyscore的区别

起因是查询数据,用了zrangebyscore 但是一直显示没数据 具体命令zrangebyscore key 0 -1 withscores, 原有印象中一直是这么用的,但是突然查不出来了, 于是搜了下问题所在。 通过分数查看 不能用0和-1表示最小和最大,只能用分数来…

Tableau 基础表制作

目录 1.数据连接 2. 数据可视化 3. 基础表制作 3.1 对比分析:比大小 1. 柱状图 2. 条形图 3. 热力图 4. 气泡图 5. 词云 3.2 变化分析:看趋势 1. 折线图 2. 面积图 3.3 构成分析:看占比 1. 饼图 2. 树地图 3. 堆积图 3.4 关…

反序列化漏洞1

一、PHP类与对象 1. 类 概念理解: 类是共享相同结构和行为的对象的集合,可以理解为特征的提取。例如将耳朵长、尾巴短、红眼睛、吃胡萝卜、蹦跳行走的动物特征抽象为"兔子"类。代码结构: 使用class关键字定义类类名遵循大驼峰命名法包含成员变量(属性)和…

为什么要对 ACI 网络进行升级?

一、硬件演进 1. 交换机接口 前面板接口由 1/10G 升级至 10/25/100G fabric 上行链路 40G 升级至 100/400G 2. 交换机角色 交换机可以是 spine 或者 leaf,而不是固定角色 3. EOS APIC-SERVER-M2/L2 2024年6月30日 EOS,替换设备为 APIC-SERVER-M4/L4 二、网络升级参考文…

DeepSeek+Cline:开启自动化编程新纪元

目录 一、引言:AI 编程时代的曙光二、认识 DeepSeek 和 Cline2.1 DeepSeek 是什么2.2 Cline 详解2.3 两者结合的魅力 三、DeepSeek Cline 安装与配置全流程3.1 安装 VS Code3.2 安装 Cline 插件3.3 获取 DeepSeek API Key3.4 配置 Cline 与 DeepSeek 连接 四、实战演…

【展位预告】正也科技将携营销精细化管理解决方案出席中睿营销论坛

在医药行业面临政策深化、技术迭代、全球化竞争的多重挑战下,第二届中睿医药健康生态生长力峰会暨第三十五届中睿医药营销论坛将于广州盛大启幕。5月19-20日本次峰会以“聚焦政策变革、把握产业趋势、构建生态共赢”为核心,旨在通过全产业链资源整合与创…

【深度学习】评估模型复杂度:GFLOPs与Params详解

评估模型复杂度:GFLOPs与Params详解 在深度学习模型设计与优化过程中,GFLOPs和Params是论文中两个重要的评估指标,它们分别衡量模型的计算复杂度和参数量。本文将详细介绍这两个概念及其在实践中的应用。 1. Params:模型参数量 …

Go语言->练习6例

1.go语言的接口实现 接口(interface)是一种类型,它定义了一组方法的集合。任何类型只要实现了接口中定义的所有方法,就被认为实现了该接口。 在Go语言中,使用接口的最佳实践可以提高代码的可读性、可维护性和灵活性。…

Drivestduio 代码笔记与理解

Rigid Node: 表示 car或者trucks Deformable Node : 表示一些 分布之外的 non-rigid 的运动物体, 比如远处的行人等和Cyclist。 在 load_objects 会读取每一个 dynamic objects 的 bounding box’的信息,具体如下: frame_instances 记录了每…

《算法笔记》10.5小节——图算法专题->最小生成树 问题 E: Jungle Roads

题目描述 The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid money was spent on extra roads between villages some years ago. But the jungle overtakes roads relentlessly, so the large road network is too expensive to mai…

【音视频】SDL简介

官网:官网 文档:文档 SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供数种控制图像、声音、输出入的函数,让开发者只 要用相同或是相似的代码就可以开发出跨多…

SpringBoot + SSE 实时异步流式推送

前言 在当今数字化时代,实时数据处理对于企业的决策和运营至关重要。许多业务场景需要及时响应数据库中的数据变化,例如电商平台实时更新库存、金融系统实时监控交易数据等。 本文将详细介绍如何通过Debezium捕获数据库变更事件,并利用Serv…

ADS1299模拟前端(AFE)代替芯片——LHE7909

在现代医疗科技的飞速发展中,精确的生物电势测量设备变得越来越重要。领慧立芯推出的LHE7909,是一款专为心电图(ECG)和其他生物电势测量设计的低噪声24位模数转换器(ADC),为医疗设备制造商提供了…

如何实现Redis和Mysql中数据双写一致性

一、引言 今天我们来聊聊一个在分布式系统中非常常见但又十分棘手的问题——Redis与MySQL之间的双写一致性。我们在项目中多多少少都遇到过类似的困扰,缓存是用Redis,数据库是用MySQL,但如何确保两者之间的数据一致性呢?接下来我…

面试篇 - Transformer前馈神经网络(FFN)使用什么激活函数?

1. FFN结构分解 原始Transformer的FFN层 FFN(x) max(0, xW₁ b₁)W₂ b₂ # 原始论文公式 输入:自注意力层的输出 x(维度 d_model512) 扩展层:xW₁ b₁(扩展为 d_ff2048) 激活函数:Re…

基于Python Flask的深度学习电影评论情感分析可视化系统(2.0升级版,附源码)

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…