GC中的一些技术

news2025/1/10 23:24:55

OopMap(ordinary object pointer map)

记录时机

  1. JIT编译时在特定的位置(安全点/安全区)记录下OopMap,记录了执行到该方法的某条指令的时候,栈上和寄存器里哪些位置是引用
  2. 类加载动作完成时,HotSpot就会计算出对象内什么偏移量上是什么类型的数据

设计目标

  1. 加速GCRoot遍历,避免栈扫描
  2. 准确式GC

Remember Set

跨代/跨区引用关系记录

实现方式

  1. 稀疏表,字典=hash table(底层使用数组实现)
  2. 细粒度表,数组=array,每个数组元素指向引用者分区中512字节内存块对本分区的引用情况。详细记录引用者分区内所有对本分区的每个引用关系
  3. 粗粒度表,位图=bitmap,每个位代表一个分区,表示该分区对本分区存在引用

记录范围

G1

  1. 分区内部引用(region):不需要记录RSet
  2. 新生代引用新生代:不需要记录RSet
  3. 新生代引用老生代:不需要记录RSet,Young GC(YGC)无需知道该引用关系。MixGC时G1会先进行YGC,然后使用YGC后的Survivor分区作为根(“借道”),因此也无需知道该引用关系。Full GC更无需知道该层关系
  4. 老生代引用老生代:需要记录RSet
  5. 老生代引用新生代:需要记录RSet

引用关系记录

通常有两种方法记录引用关系:Point In/Point Out
假设有引用关系如下:ObjB.feild= ObjC

  1. point out:在对象C的RSet中记录对象B的地址。记录简单,如果判断一个对象是有用/无用,需要遍历RSet,才能确定没有任何对象引用某个对象
  2. point in:在对象B的RSet中记录对象C的地址。记录复杂,如果判断一个对象是有用/无用,不需要遍历RSet

G1采用的是point in方法

SATB(Snapshot At The Beginning)

G1为并发标记引入SATB算法。该算法有个前提是堆的对象内存分配是连续。个人认为还有一个前提是使用了标记-整理算法,不存在内存碎片,新对象不会被分配至碎片内存中

  1. Bottom/Pre/Next/Top指针,用于工作内存区域划分
    1. Bottom:指向堆内存起始位置
    2. Pre TAMS(Top-At-Mark-Start):指向上一次并发标记处理后的内存地址终点
    3. Next TAMS(Top-At-Mark-Start):指向并发标记开始之前堆内存已分配成功的地址终点
    4. Top:指向并发标记开始之后当前堆内存分配成功的地址终点
  2. NextBitmap/PreBitmap位图,用于记录标记状态。记录PreBitmap的好处是如果标记失败,不会丢失上一次内存标记状况(即Pre指针之前的内存标记状况)

satb.drawio.png

消失的对象问题(Lost Object Problem)

问题描述

标记过程中修改了引用关系,B.C=null,A.D=D,此时如果不做特殊处理的话,那么D会被误杀,因为A已经为黑色标记完成,不会再尝试去标记它的子节点D
Lost Object Problem.drawio.png

解决方法

问题出现的前提条件必须同时满足下面两个条件

  1. 新增黑色节点对白色节点的引用
  2. 删除灰色节点对白色节点的直接/间接引用

CMS解决方法是针对条件1:新增黑色节点对白色节点引用时会将新引用关系的引用者(黑色节点)标记为灰色
Lost Object Problem-第 2 页.drawio.png

G1/ZGC解决方法是针对条件2:删除灰色节点对白色节点引用时会将老引用关系的被引用者标记为灰色
Lost Object Problem-第 3 页.drawio.png

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

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

相关文章

关于sql注入这一篇就够了

本文章根据b站迪总课程总结出来,若有不足请见谅 目录 本文章根据b站迪总课程总结出来,若有不足请见谅 存在sql注入条件 判断数据库类型 注入mysql思路 判断网站是否存在注入点 判断列名数量(字段数) 文件读写操作 网站路径获取方法 注入类型 按注入点数据…

Linux物理内存:伙伴系统(buddy system)

引入之前写过一篇文章将伙伴系统,可以参考:内存池算法简介从上面的虚拟机上可以看到,X86系统上,有三个物理内存区,DMA,DMA32,Normal,可以看到阶数为11。struct page {atomic_t _mapc…

J DBC相关

JDBC基础什么是JDBC入门程序功能类工具类SQL注入攻击原理PreparedStatement的介绍数据库连接池原理自定义连接池归还连接JDBC框架自定义JDBC框架JDBC基础 什么是JDBC 用于执行SQL语句的java API,实现不同关系型数据库的连接 入门程序 导入jar包 注册驱动 获取连…

Linux驱动开发基础__gpio子系统重要概念

目录 1 引入 2 在设备树中指定引脚 3 在驱动代码中调用GPIO子系统 4 sysfs 中的访问方法 1 引入 要操作 GPIO 引脚,先把所用引脚配置为 GPIO 功能,这通过 Pinctrl 子系统来实现。 然后就可以根据设置引脚方向(输入还是输出)、读值──获得电平状…

Windows Docker Desktop开放API端口2375用于远程调用

Windows Docker Desktop开放API端口2375用于远程调用问题解决开启IP Helper服务开启Docker配置开放2375端口端口映射找到需要暴露的IP执行端口映射命令Windows防火墙关闭防火墙添加防火墙规则测试问题 Windows Docker Desktop为了安全,默认设置中只有localhost:237…

入门的葡萄酒知识

葡萄酒的分类(根据制造方法) 静态葡萄酒 红葡萄酒 Red Wine,白葡萄酒 White Wine,玫瑰红/桃红/粉红葡萄Rose Wine。 气泡(起泡)葡萄酒 有气泡的葡萄酒,分香槟Champagne及气泡葡萄酒两类。只有在…

Servlet(上)

Servlet组件(上) 学习目标 了解Web资源的概念了解为什么需要Servlet掌握Servlet是什么掌握Servlet的HelloWorld掌握Servlet的执行原理掌握Servlet的生命周期和生命周期方法掌握ServletConfig的使用掌握Servlet的体系结构掌握Servlet的映射路径的编写方式掌握创建Servlet最常用…

机器学习简单介绍

机器学习简介 定义 机器学习是人工智能(AI)和计算机科学的一个分支,专注于使用数据和算法来模仿人类的学习方式,逐步提高其准确性。 简单来说,是一种运用数学公式来对问题进行最优化求解的方法 分类 一般来说将:机器学习分为…

睿联技术在创业板过会:收入依赖摄像机单机,计划募资11亿元

2023年1月6日,深圳证券交易所披露的信息显示,深圳市睿联技术股份有限公司(下称“睿联技术”)获得创业板上市委员会审议通过。据贝多财经了解,睿联技术的上市申请于2022年6月2日获得创业板受理。 本次冲刺创业板上市&am…

Unity 3D 地形系统概述|| Unity 3D 创建地形

在三维游戏世界中,通常会将丰富多彩的游戏元素融合在一起,比如游戏中起伏的地形、郁郁葱葱的树木、蔚蓝的天空、、凶恶的猛兽等,营造出身临其境的游戏沉浸感,让玩家置身游戏世界,忘记现实。 地形作为游戏场景中必不可…

Git 基本概念

一、git 官网 https://git-scm.com/ 二、git 数据传输命令 三、基本操作 1、命令整理 命令说明git init初始化 git 库git config获取和设置存储库或全局配置项git status显示工作树状态git add将文件内容添加到index(暂存区)git commit将index(暂存区)修改提交到本地仓库gi…

你知道微服务架构中的“发件箱模式”吗

前言 微服务架构如今非常的流行,这个架构下可能经常会遇到“双写”的场景。双写是指您的应用程序需要在两个不同的系统中更改数据的情况,比如它需要将数据存储在数据库中并向消息队列发送事件。您需要保证这两个操作都会成功。如果两个操作之一失败&…

数据结构与算法—稀疏数组

稀疏数组 稀疏数组与二维数组 当一个数组中大部分元素都是0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 二维数组转成稀疏数组: 从图中可以看出: 稀疏数组的行、列、值的 (1)[0]行&#x…

linux下软硬链接到底是什么?

文章目录前言硬链接软链接前言 在了解软硬链接之前,可以先来了解一下磁盘以及inode到底是什么 Linux文件管理—磁盘上文件如何管理(inode) 硬链接 什么是硬链接 在Linux下,系统标识文件的唯一方式就是inode号,而对…

【初阶数据结构】——双“指针”求解数组常见问题

文章目录前言题目1:移除元素思路1:暴力求解思路2:时间换空间思路3:双指针原地删除(解法2的再优化)思路分析代码实现题目2:删除有序数组中的重复项思路:双指针代码实现题目3&#xff…

【JavaScript】BOM 学习总结

基础知识&#xff1a; 获取浏览器窗口的尺寸&#xff1a; innerHeight&#xff1a;获取高度 innerWidth&#xff1a;获取宽度 跳转与刷新 location.href location.reload() body><button id"btn">跳转到下一个页面</button><button id"btn…

Java实现文件操作

目录 一、文件概述 二、常见文件操作 1、获取文件路径 2、判断文件存在以及判断类型 3、文件的创建与删除 4、展示文件夹的文件 5、创建文件夹 三、用数据流来读取文件内容 1、操作字节流文件 a、读取字节流文件 b、写字节流文件 2、操作字符流对象 a、读取…

C++ · 入门 · 03 | 函数重载

啊我摔倒了..有没有人扶我起来学习.... 目录前言函数重载1.1 函数重载概念1.2 函数重载的意义1.3 C支持函数重载的原理--名字修饰(name Mangling)1.4 返回值不同能否构成函数重载?前言 自然语言中&#xff0c;一个词可以有多重含义&#xff0c;人们可以通过上下文来判断该词真…

小米 2021 秋招面试总结

岗位:嵌入式软件工程师(相机驱动岗) 面试时间: 40 分钟 薪资: 28w+ 面试过程 面试官上来先来了一段他自己的自我介绍,流程还是比较规范的。 1、请进行一个简单的自我介绍(2分钟) 2、C语言全局变量可否定义在头文件中? 回答:不能,并且这不是一个好的习惯。 3…

【自学C++】C++输出cout

C输出cout C输出cout教程 在 C 语言 中我们需要输出一个 变量&#xff0c;可以使用 printf。printf 函数 在输出时&#xff0c;我们必须要指定输出的数据类型对应的格式化符&#xff0c;挺不方便。 在 C 中&#xff0c;我们要输出变量&#xff0c;直接使用 std 命名空间中的…