HotSpot虚拟机OopMap、SafePoint、RememberedSet

2023-10-11 23:59

本文主要是介绍HotSpot虚拟机OopMap、SafePoint、RememberedSet,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

HotSpot虚拟机垃圾回收算法细节

    • 快速根节点枚举OopMap
    • 安全点Safepoint和OopMap
    • 解决对象跨代引用Remembered Set
    • 如何支持并发标记

快速根节点枚举OopMap

  1. GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如 栈帧中的本地变量表)中
  2. 目前主流Java虚拟机使用的都是准确式垃圾收集,准确式就是说给定某个位置上的某块数据,要能知道它的准确类型是什么,这样才可以合理地解读数据的含义;GC所关心的含义就是“这块数据是不是指向GC堆的引用”。
    要实现这样的GC,JVM就要能够判断出所有位置上的数据是不是指向GC堆里的引用,包括活动记录(栈+寄存器)里的数据
  3. 一个不漏地从方法区等GCRoots开始查找的话可以支持准确式GC,但是查找效率太慢。所以HotSpot从外部记录下类型信息,存成映射表来支持上述的准确式GC,这就是OopMap。
  • 要实现这种功能,需要虚拟机里的解释器和JIT编译器都有相应的支持
  • 每次都遍历原始的映射表,循环的一个个偏移量扫描过去,一旦类加载动作完成的时候, HotSpot就会把对象内什么偏移量上是什么类型的数据计算出来(解释器)
  • 为每个映射表生成一块定制的扫描代码(想像扫描映射表的循环被展开的样子),以后每次要用映射表就直接执行生成的扫描代码,就会在特定的位置记录下栈里和寄存器里哪些位置是引用(JIT编译器)
  1. 在HotSpot中,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象的实例数据里有记录自己的OopMap,记录了在该类型的对象内什么偏移量上是什么类型的数据。所以从对象开始向外的扫描可以是准确的;这些数据是在类加载过程中计算得到的。

安全点Safepoint和OopMap

  1. 每个被JIT编译过后的方法会在一些特定的位置记录下OopMap,记录了执行到该方法的某条指令的时候,栈上和寄存器里哪些位置是引用。这样GC在扫描栈的时候就会查询这些OopMap就知道哪里是引用了。
  2. 这些特定的位置主要在:
  • 循环的末尾
  • 方法临返回前 / 调用方法的call指令后
  • 可能抛异常的位置
    这种位置被称为“安全点”(safepoint),所以,每个方法可能会有好几个oopMap,就是根据safepoint把一个方法的代码分成几段,每一段代码一个oopMap,作用域自然也仅限于这一段代码;
  1. 所以HotSpot中GC不是在任意位置都可以进入,而只能在safepoint处进入;
  2. 可以把oopMap简单理解成是调试信息。在源代码里面每个变量都是有类型的,但是编译之后的代码就只有变量在栈上的位置了。oopMap就是一个附加的信息,告诉你栈上哪个位置是什么类型的数据。

解决对象跨代引用Remembered Set

  1. 在HotSpot虚拟机中,基于分代收集理论的垃圾收集器,使用记忆集(Remembered Set)解决对象跨代引用带来的问题;
  2. 记忆集是一种用于记录从非收集区域指向收集区域的指针集合的抽象数据结构。
  3. 常用数据结构形式为卡表(一个字节数组)
CARD_TABLE [this address >> 9] = 0;

字节数组CARD_TABLE的每一个元素都对应着其标识的内存区域中一块特定大小的内存块,这个 内存块被称作“卡页”(Card Page)。HotSpot中使用的卡页是2的9次幂,即512字节(地址右移9位,相当于用地址除以512)。
4. 卡表之所以使用byte数组而不是bit数组主要是速度上的考量,现代计算机硬件都是最小按字节寻址的, 没有直接存储一个bit的指令,所以要用bit的话就不得不多消耗几条指令。
5. HotSpot虚拟机里是通过写屏障(Write Barrier)技术维护卡表状态的。写屏障可以看作在虚拟机层面对“引用类型字段赋值”这个动作的AOP切 面,在引用对象赋值时会产生一个环形(Around)通知,供程序执行额外的动作,也就是说赋值的 前后都在写屏障的覆盖范畴内。
6. 应用写屏障后,虚拟机就会为所有赋值操作生成相应的指令,一旦收集器在写屏障中增加了更新 卡表操作,无论更新的是不是老年代对新生代对象的引用,每次只要对引用进行更新,就会产生额外 的开销,不过这个开销与Minor GC时扫描整个老年代的代价相比还是低得多的。

如何支持并发标记

  1. 三色标记法辅助推导:
  • 白色:代表不可达或者没有扫描过,扫描完仍是白色的对象就会被清除回收;
  • 黑色:代表已扫描且是安全存活
  • 灰色:代表已扫描但这个对象上至少存在一个引用还没有被扫描过;
  • 初始状态:GCRoot对象是黑色,其他对象都是白色
  • 重要原则:黑色对象不可能直接(不经过灰色对象)指向某个白色对象
    在这里插入图片描述
  1. CMS(Concurrent Mark Sweep)使用增量更新算法来保证重新标记阶段,可以修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录。增量更新使用三色标记法可以理解为:当黑色对象插入新的指向白色对象的引用关系时,就将这个新 插入的引用记录下来,等并发扫描结束之后,再将这些记录过的引用关系中的黑色对象为根,重新扫 描一次。
  2. G1、Shenandoah使用原始快照来实现并发标记的。原始快照:当灰色对象要删除指向白色对象的引用关系时,就将这个要删 除的引用记录下来,在并发扫描结束之后,再将这些记录过的引用关系中的灰色对象为根,重新扫描 一次。这也可以简化理解为,无论引用关系删除与否,都会按照刚刚开始扫描那一刻的对象图快照来 进行搜索。

这篇关于HotSpot虚拟机OopMap、SafePoint、RememberedSet的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/191784

相关文章

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

虚拟机与物理机的文件共享方式

《虚拟机与物理机的文件共享方式》文章介绍了如何在KaliLinux虚拟机中实现物理机文件夹的直接挂载,以便在虚拟机中方便地读取和使用物理机上的文件,通过设置和配置,可以实现临时挂载和永久挂载,并提供... 目录虚拟机与物理机的文件共享1 虚拟机设置2 验证Kali下分享文件夹功能是否启用3 创建挂载目录4

HotSpot虚拟机的经典垃圾收集器

读《深入理解Java虚拟机》第三版笔记。 关系 Serial、ParNew、Parallel Scavenge、Parallel Old、Serial Old(MSC)、Concurrent Mark Sweep (CMS)、Garbage First(G1)收集器。 如图: 1、Serial 和 Serial Old 收集器 2、ParNew 收集器 3、Parallel Sc

理解java虚拟机内存收集

学习《深入理解Java虚拟机》时个人的理解笔记 1、为什么要去了解垃圾收集和内存回收技术? 当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些“自动化”的技术实施必要的监控和调节。 2、“哲学三问”内存收集 what?when?how? 那些内存需要回收?什么时候回收?如何回收? 这是一个整体的问题,确定了什么状态的内存可以

虚拟机ubuntu配置opencv和opencv_contrib

前期准备  1.下载opencv和opencv_contrib源码 opencv-4.6.0:https://opencv.org/releases/ opencv_contrib-4.6.0:https://github.com/opencv/opencv_contrib 在ubuntu直接下载或者在window上下好传到虚拟机里都可以 自己找个地方把他们解压,个人习惯在home下新建一

OpenStack创建虚拟机过程

OpenStack创建虚拟机过程 一、在分析OpenStack创建虚拟机的过程之前,先来梳理一下需要用用到哪些组件。 二、每一步都需要去keystone去进行验证,下图有详细的流程。 登录界面或命令行通过RESTful API向keystone获取认证信息。keystone通过用户请求认证信息,并生成auth-token返回给对应的认证请求。界面或命令行通过RESTful API

VMware Fusion Pro 13 Mac版虚拟机 安装Win11系统教程

Mac分享吧 文章目录 Win11安装完成,软件打开效果一、VMware安装Windows11虚拟机1️⃣:准备镜像2️⃣:创建虚拟机3️⃣:虚拟机设置4️⃣:安装虚拟机5️⃣:解决连不上网问题 安装完成!!! Win11安装完成,软件打开效果 一、VMware安装Windows11虚拟机 首先确保自己的mac开启了网络共享。不然虚拟机连不上👀的 1️⃣:准备镜像

SSH连接虚拟机中的Ubuntu 12.0.4

摘要:主要是解决不能使用ssh远程Ubuntu的问题、使用的远程工具是putty、也可以使用xshell、ubunut12.0.4是装在虚拟机中的、不过这个应该没有什么影响。 一:问题的出现 前两天使用VMware装了一个ubuntu12.0.4之后、因为常常使用命令行、又喜欢在虚拟机与实体机中切来切去、感觉很不方便、就想在xp中远程ubuntu、遇到了点小意外、经过一会调试解决成功、把

用了虚拟机后,本机摄像头打不开了(联想电脑thinkpad)

虚拟机有摄像头,我断开了连接,现在本机的摄像头打开就是一个锁 我先把虚拟机的摄像头关了 然后把本机的vm usb关闭了 Win+R),输入services.msc,找到VMware USB Arbitration Service,确保其状态为“关闭 然后打开桌面助手 开启 参考: 联想知识库

Java虚拟机垃圾回收的几个关键问题

20151008 GC的几个关键问题,触发条件,触发的机制 主线是数据的移动,从什么位置到什么位置,移动的条件是什么? 1 垃圾收集在什么时候触发? GC都是在带满了的时候触发的,每次触发都是把不会用的不可达的对象空间回收了,留下还在用的对象。 1) MinorGC的触发是伊甸园空间满的时候 2) FullGC的触发是在老年代满的时候 2 垃圾回收的时候做哪些工作? 1) 一个新的对象new出