HotSpot的算法实现

news2025/2/22 4:23:47

1.根节点的枚举

       我们通过可达性分析算法从GC Roots中找到全局性的引用(例如常量或者类静态属性)或者是执行上下文(例如栈帧中的本地变量)中,尽管我们的目标非常明确,但是随着java的不断扩大,光一个方法区内的常量、类静态变量就有很多,我们通过该方法区一个一个查询,肯定效率上就有很大的消耗

       在现存的收集器中在根节点枚举这一步骤都是要暂停用户线程的,但这样就会出现“stop the world”的现象(用户感觉到的就是系统的卡顿),我们作为软件的开发者,我们必须要降低“stop the world”现象的发生的次数,根节点枚举必须在一个保障一致性的快照中才得以进行(整个枚举期间执行子系统看起来像是在被冻结在某个时间点上)

       现在Java虚拟机用的都是准确式垃圾收集,当所有的用户线程停顿下来的时候,我们不需要一个不漏的去检查所有执行上线文全局的引用位置Java虚拟机是使用OopMap的数据结构来直接得到哪些地方是存放着对象的引用,一旦类加载动作完成时,Java虚拟机就会将对象内的偏移量上是什么数据类型计算出来,在即时编译的时候,也会在特定的位置上记录下栈里和寄存器里哪些位置是引用,这样就避免了每次从GC Roots中开始查找

2.安全点

        HotSpot没有为每条指令都生成一个OopMap,只是在特定的位置生成OopMap,这些特定的位置就是所谓的“安全点”,有了安全点的设定,也就意味着用户程序不能想当然的在任意位置都可以停顿下来进行垃圾收集,而是必须强制到所谓的安全点才可以停顿进行垃圾回收,安全点的选取也是有一定的说法的

  • 安全点的选取不能太少以至于会让收集器等待时间过长
  • 安全点的选取不能太过于频繁以至于增大运行时的内存负荷

2.1 安全点选取的标准

       安全点选取的标准是按照“是否让程序长时间执行的特征”,长时间执行最明显的特征就是指令序列的复用,具有这些功能的指令才会产生安全点

  • 方法调用
  • 循环跳转
  • 异常跳转

2.2 如何让所有的线程跑到最近的安全点、停顿?

2.2.1 抢占式中断

       抢占式中断不需要线程的执行代码去主动配合,在垃圾收集发生时,系统会将所有的用户线程全部中断,如果发现某些线程中断的位置不是安全点的位置,然后就恢复这条线程的执行,然后过一会再进行中断,直到跑到安全点上

2.2.2 主动式中断

       当垃圾收集需要中断线程的时候,不能直接对线程进行操作,仅仅的设置一个标志位,各个线程执行的过程中不停的去主动轮询这个标志,一旦发现中断标志为真时就自己在最近的安全点上主动中断挂起

3.安全区域

3.1出现的原因

       我们已经通过安全点已经解决了程序执行时让虚拟机进入垃圾回状态的问题,但是在程序不执行(所谓的程序不执行就是没有分配处理器的时间,例如用户线程处于Sleep状态或者Blocked状态)的时候呢?我们又有什么办法去进行垃圾回收呢?这时候我们就引入了安全区域来进行解决

3.2 什么是安全区域?

       安全区域就是能够确保在某一段代码片段之中,引用关系不会发生变化,因此,在这个区域中的任意地方开始进行垃圾收集都是安全的,我们也可以将安全区域看作为被伸长的一系列安全点

3.3 怎么样安全的退出安全点?

       当线程要退出安全点的时候,它要检查虚拟机是否已经完成了根节点的枚举,如果完成了,那线程就当做什么事情也没发生过,继续执行,如果没有发生,它就必须一直等待,直到收到可以离开安全区域的型号为止

4.记忆集与卡片

       为了解决对象跨代引用所带来的问题,垃圾收集器在新生代建立了名为记忆集的数据结构,用于避免将整个老年代加进GC Roots扫描范围

       记忆集时一种用于记录从非收集区域指向收集区域的指针集合的抽象数据结构(记忆集的数据结构可能不是上图我画的这样,感兴趣的同学可以自行下去查询资料进行了解)

4.1 记忆集的记录粒度

       在垃圾收集的场景中,收集器只需要判断出某一块非收集区域是否存在有指向了收集区域的指针就可以了,并不需要了解这些指针的细节,所有我们就可以选择一些粗犷的记录粒度来节省记忆集的存储和维护成本

  • 字节精度:每个记录精确到一个机器字长(处理器的寻址位数),该字节包括跨代指针
  • 对象精度:每个记录精确到一个对象,该对象里有字段含有跨代指针
  • 卡精度:每个记录精确到一个内存区域,该区域内有对象含有跨代指针

4.2 卡表

在4.1中了解到的卡精度其实就是我们这里的卡页,这是目前最常用的一种记忆集实现形式

卡表最简单的形式只是一个字节数组

CARD_TABLE[this address>>9]=0;

       字节数组的每一个元素都对应着其标识的内存区域中一块特定大小的内存块,这个内存块被称之为“卡页”,一般来说,卡页大小都是以2的N次幂的字节数,一个卡页中内存中通常包含不止一个对象,只要卡页有一个(或更多)对象的字段存在着跨代指针,那就将对应卡表的数组元素的值标识为1,称之为这个元素变脏,没有则标识为0,在垃圾回收的时候,只要筛选出卡表中元素变脏的元素,就可以轻而易举的得出哪些卡页内存中存在跨代指针,将它们假如GC Roots中一并扫描

5.三色标记法

  • 白色:表示对象未被垃圾收集器访问过,显然在可达性分析刚刚开始的阶段,所有的对象都是白色的,若在分析结束的阶段,仍然是白色的对象,即代表不可达
  • 黑色:表示对象已经被垃圾收集器访问过,且这个对象的所有引用都已经扫描过,黑色的对象代表已经被扫描过,它是安全存活的,如果有其他对象引用指向了黑色对象,无需再扫描一遍,黑色对象不可能直接指向某个白色对象
  • 灰色:表示对象已经被垃圾收集器访问过,但是这个对象上至少存在一个引用还没有被扫描过的白色对象

5.1 误标

所谓的误标就是将“原本是黑色的对象被误标为白色的对象”,会产生对象消失,应该满足的条件:

  • 赋值器插入一条或多条从黑色对象到白色对象的新引用
  • 赋值器删除了全部从灰色对象到该白色对象的直接或者间接引用

5.2 误标的解决方法

  • 增量更新(破坏第一个条件):当黑色对象插入新的指向白色对象的引用关系时,就将这个新插入的引用记录下来,等并发扫描结束之后,再将这些记录过的引用关系中的黑色对象为根,重新再扫描一遍(黑色对象一旦插入了指向白色对象的引用之后,它就变回灰色对象了)
  • 原始快照(破坏第二个条件):当灰色对象要删除指向白色对象的引用关系时,就要将这个删除的引用记录下来,在并发扫描结束后,再将这些记录过的引用关系中的灰色对象为根,重新扫描一次(无论引用关系删除与否,都会按照刚刚开始扫描那一刻的对象快照来进行搜索)

在HotSpot虚拟机中,增量更新和原始快照这两种解决方案都是有实际应用的,例如,CMS是基于增量更新来做并发标记的,G1则是用原始快照来实现的

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

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

相关文章

JTS: 12 Descriptions 图形覆盖

这里写目录标题 版本代码Intersection 交集Union 并集Difference 差集SymDifference 补集 版本 org.locationtech.jts:jts-core:1.19.0 链接: github 代码 /*** 图形覆盖操作* author LiHan* 2023年10月12日 19:34:09*/ public class GeometryDescriptions {private final Ge…

抽象类

一、认识抽象类 public abstract class A {//类该有的成员,抽象类都有private String name;public static String schoolName;public A() {}//抽象方法:必须有abstract修饰 只有方法签名,没有方法体public abstract void run();} //一个类继…

Kafka SASL认证授权(六)全方位性能测试

Kafka SASL认证授权(六)全方位性能测试。 官网地址:https://kafka.apache.org/ 一、场景 线上已经有kafka集群,服务运行稳定。但是因为产品升级,需要对kakfa做安全测试,也就是权限验证。 但是增加权限验证,会不会对性能有影响呢?影响大吗?不知道呀! 因此,本文就此…

机器学习网络模型绘图模板

一 前言 本期为读者推荐一款名为ML Visuals的机器学习画图PPT模板,ML Visuals 专为解决神经网络画图问题设计,通过提供免费的专业的、科学的和充分的视觉和图形来帮助机器学习社区改善科学传播。目前,ML Visuals 包含了超过100多个的自定义图…

Python接口自动化 —— token登录(详解)

简介 为了验证用户登录情况以及减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。有些登录不是用 cookie 来验证的,是用 token 参数来判断是否登录。token 传参有两种一种是放在请求头里,本质上是跟 cookie 是一样的&am…

人大与加拿大女王大学金融硕士——带你了解GMAT考试为何如此重要

随着社会经济的发展,金融行业的优势愈发明显。越来越多的人想要进入金融行业发展,但学历往往成为了敲门砖。自人大与加拿大女王大学金融硕士项目创办以来,受到了许多学子及在职人士的欢迎,但想要报考人大加拿大女王大学金融硕士项…

一文讲清楚webpack和vite原理

一、前言 每次用vite创建项目秒建好,用vue-cli创建了一个项目,却有点久,那为什么用 vite 比 webpack 要快呢,这篇文章带你梳理清楚它们的原理及不同之处!文章有一点长,看完绝对有收获! 目录&a…

nginx之location的优先级和nginx的重定向

一、nginx之location的优先级和匹配方式(重点) (一)nginx的正则表达式 nginx的正则表达式 符号 含义 ^ 字符串的起始位置(以什么开头) $ 字符串的结束位置(以什么结尾) * 匹…

漏洞复现(CVE-2023-35843)

免责声明: 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

Nginx正向代理配置(http)

前言 在工作中我们经常使用nginx进行反向代理,今天介绍下怎么进行正向代理,支持http请求,暂不支持https 首先先介绍下正向代理和反向代理。 正向代理 在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。 反向代理 客户端只…

字符串匹配——KMP算法

目录 KMP(Knuth Morris Pratt) KMP算法复杂度分析 字符串匹配中除了简单的BF(Brute Force)、RK(Rabin-Karp)算法,还有更高效、较难理解的 BM(Boyer-Moore)和KMP&#…

Android之根据时区获取当前时间

文章目录 前言偶尔我们也会做多个国家的APP,难免少不了时间显示,所以我们就需要获取当前时区的当前时间,几句代码解决、 一、效果图二、实现步骤1.TimeUtil2.调用 总结 前言 偶尔我们也会做多个国家的APP,难免少不了时间显示&…

从公司搭建的gitlab代码仓拉取代码失败问题

从gitlab代码仓拉取代码失败问题解决 1.问题描述2.分析解决3.解决问题 1.问题描述 1.在访问到从公司搭建的gitlab代码仓后,选择了要拉取的地址,使用git拉取代码时,拉取失败,报错如下 2.分析解决 1.因为网页可以看到代码仓中这…

yolov7模型训练环境安装

ANACONDA Free Download | Anacondahttps://www.anaconda.com/download/进入ANACONDA安装的盘后输入python测试环境是否安装完成 进入 cd Scripts后 在同路径下下载,pip install opencv-python cd.. 退回上层 python 打开’ import cv2 cv2.__version__…

Redis学习1

NOSql型数据库 NoSQL(Not Only SQL)是一种数据库管理系统的范畴,它不使用传统的关系型数据库管理系统(RDBMS)模型。相对于传统的关系型数据库,NoSQL 数据库在数据存储和检索方面提供了更多的灵活性和可伸缩…

B端企业为什么需要软文推广?媒介盒子告诉你

在传统的营销概念中,大部分人认为B端企业不需要品牌曝光,企业只需要靠质量与服务就能获得稳定客源,而在互联网加速发展的今天,B端企业的营销方式也发生变化,有不少B端企业来找媒介盒子进行软文推广,接下来媒…

Git遇到问题收集

您的企业已过期或者超过配额,请升级或续订! 如何解决: 此问题是企业仓库满额导致,联系公司的gitee管理人员进行处理

c++图像处理-----自适应阈值操作:`cv::adaptiveThreshold()`

自适应阈值操作:cv::adaptiveThreshold() cv::adaptiveThreshold()是OpenCV库中的一个函数,用于图像处理中的自适应阈值二值化操作。这个函数通常用于将灰度图像转换为二值图像,其中每个像素的阈值是根据其周围邻域的像素值自动确定的&#…

(2023|CVPR,中文,扩散,知识增强,去噪专家组合)ERNIE-ViLG 2.0:利用知识增强的去噪专家组合改进文本到图像扩散模型

ERNIE-ViLG 2.0: Improving Text-to-Image Diffusion Model with Knowledge-Enhanced Mixture-of-Denoising-Experts 公众号:EDPJ(添加 VX:CV_EDPJ 或直接进 Q 交流群:922230617 获取资料) 目录 0. 摘要 1. 简介 …

Windows 进程监视工具

Windows 进程监视器是一种工具,可帮助 IT 管理员监视其 Windows IT 基础结构终结点中的关键进程,并确保其持续可用性、一致的运行状况和最佳性能。通过主动监视关键服务,Windows 进程监视器可帮助 IT 管理员确保其 Windows 进程不会意外关闭或…