JVM垃圾收集-ZGC的染色指针🌈

JVM垃圾收集-ZGC的染色指针🌈大部分追踪式垃圾收集器在并发标记阶段都采用了三色标记技术。但也有例外,比如:ZGC收集器有一个标志性的设计,就是采用了染色指针技术(Colored Pointer,其他类似的技术中可能将它称为Tag

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

JVM垃圾回收系列(三):染色指针

前言:

介绍染色指针之前,大家先回顾以下上一篇文章 《JVM垃圾收集-三色标记》 ,大部分追踪式垃圾收集器在并发标记阶段都采用了三色标记技术。但也有例外,比如:ZGC收集器有一个标志性的设计,就是采用了染色指针技术(Colored Pointer,其他类似的技术中可能将它称为Tag Pointer或者Version Pointer)。下面就来介绍一下染色指针。

应用场景

之前,如果我们要在对象上存储一些额外的、只供收集器或者虚拟机本身使用的数据,通常会在对象头中增加额外的存储字段,如对象的哈希码、分代年龄、锁记录等就是这样存储的。比如 64 位的 JVM,对象头的 Mark Word 中保存的信息如下图:

jm1.png

这种记录方式在有对象访问的场景下是很自然流畅的,不会有什么额外负担。但如果有一些对象根本就不会去访问它,但又希望得知该对象的某些信息的场景呢?

我们就有这样的场景——追踪式收集算法的标记阶段就可能存在只跟指针打交道而不必涉及指针所引用的对象本身的场景。

🌰例如 对象标记的过程中需要给对象打上三色标记,这些标记本质上就只和对象的引用有关,而与对象本身无关——某个对象只有它的引用关系能决定它存活与否,对象上其他所有的属性都不能够影响它的存活判定结果。

HotSpot虚拟机的几种收集器有不同的标记实现方案:

  • 把标记直接记录在对象头上(Serial收集器
  • 把标记记录在与对象相互独立的数据结构上(G1Shenandoah使用了一种相当于堆内存的1/64大小的,称为BitMap的结构来记录标记信息)
  • ZGC的染色指针直接把标记信息记在引用对象的指针上(这个时候,与其说可达性分析是遍历对象图来标记对象,还不如说是遍历“引用图”来标记“引用”了。)

染色指针

染色指针是一种直接将少量额外的信息存储在指针上的技术。在 64 位 Linux 中,对象指针是 64 位,如下图:

jm2.png

👉🏻在这个 64 位的指针上,高 18 位都是 0,暂时不用来寻址。剩余的 46 位指针所能支持内存可以达到 64TB ,这可以满足多数大型服务器的需要了。不过 ZGC 并没有把 46 位都用来保存对象信息,而是用高 4 位保存了四个标志位,导致 ZGC 可以管理的最大内存不超过 4 TB 。

通过这四个标志位,JVM 可以从指针上直接看到对象的三色标记状态(Marked0Marked1)、是否进入了重分配集(Remapped)、是否需要通过 finalize 方法来访问到(Finalizable)等信息。

无需进行对象访问就可以获得 GC 信息,这大大提高了 GC 效率。 🚀🚀🚀

可以看到染色指针的优点已经很明显了。不过,要使用染色指针有一个必须解决的前置问题:Java虚拟机作为一个普普通通的进程,这样随意重新定义内存中某些指针的其中几位,操作系统是否支持?处理器是否支持?

👨‍💻程序代码最终都要转换为机器指令流交付给处理器去执行,处理器可不会管指令流中的指针哪部分存的是标志位,哪部分才是真正的寻址地址,只会把整个指针都视作一个内存地址来对待。

在我们常用的x86-64平台上是不支持重新定义机器指令的,ZGC设计者们就采用了虚拟内存映射技术来解决这个问题。

虚拟内存映射

在x86平台上,处理器会使用分页管理机制把线性地址空间物理地址空间分别划分为大小相同的块,这样的内存块被称为 “页”(Page) 。通过在线性虚拟空间的页与物理地址空间的页之间建立的映射表,分页管理机制会进行线性地址到物理地址空间的映射,完成线性地址到物理地址的转换。

✨简单的理解为:用 mmap 把不同的虚拟内存地址映射到同一个物理内存地址上。 如下图所示:

jm3.png

ZGC 为了解决上面的寻址地址问题,使用了虚拟内存映射技术,把同一块儿物理内存映射为 Marked0、Marked1 和 Remapped 三个虚拟内存

当应用程序创建对象时,会在堆上申请一个虚拟地址,这时 ZGC 会为这个对象在 Marked0Marked1Remapped 这三个视图空间分别申请一个虚拟地址,这三个虚拟地址映射到同一个物理地址。

Marked0、Marked1 和 Remapped 这三个虚拟内存作为 ZGC 的三个视图空间,在同一个时间点内只能有一个有效。ZGC 就是通过这三个视图空间的切换,来完成并发的垃圾回收。

🙇好了关于染色指针的就介绍到这里。

PS: 在 JDK 15 中 ,已经可以通过指令 –XX:+UseZGC 来启用采用染色指针技术的 ZGC收集器了。

🚀🚀🚀

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13046.html

(0)

相关推荐

  • 用Python创建并管理线程的完整指南

    用Python创建并管理线程的完整指南现代编程需要对多任务处理有一个更好的理解,因为处理器的核心数已经增加,多线程编程已经成为一种常见而重要的技能。Python提供了非常优秀的线程支持,使开发者可以轻松地创建并管理线程。

    2024-08-03
    29
  • Python变量定义

    Python变量定义在编程语言中,变量是存储数据的容器。它们可以存储各种类型的数据,例如字符串、数字、布尔值等等。变量名在程序中是唯一的,您可以指定任意变量名,但是要确保它们没有使用过,且易于理解。换句话说,您可以将变量视为程序中的一个标签,用于告诉计算机在执行代码时在哪里找到数据。

    2024-08-15
    28
  • 如何退出vim编辑模式

    如何退出vim编辑模式Vi是一个很古老却也很强大的文本编辑器,Vim是Vi的增强版。在使用Vim编辑文件时,由于其非常特殊的编辑模式和操作方式,经常会导致新手遇到困难。尤其是在退出编辑模式时,可能会不小心关闭文件而没有保存,或者根本不知道如何退出编辑模式。本文将详细介绍如何正确地退出Vim编辑模式。

    2024-07-02
    45
  • iphone屏幕自适应_b站怎么适配全面屏

    iphone屏幕自适应_b站怎么适配全面屏全面屏刚出时,网上有说反人类。但过去这么久了,趋于技术的进步或看久了,大家也都慢慢习惯了(只是笔者还是买不起全面屏)。官方适配中文版文档也出来了。 回想起刚开始适配全面屏用了一种暴力、并不优雅的方法,以至于后来出了XS(MAX)和XR后出了bug。所以选择一种可靠的、优雅的方案…

    2023-08-05
    127
  • Ubuntu 下 Mariadb 数据库的安装和目录迁移

    Ubuntu 下 Mariadb 数据库的安装和目录迁移Ubuntu 下 Mariadb 数据库的安装和目录迁移 1、简介 本文主要是 Ubuntu 下 Mariadb 数据库的安装和目录迁移,同样适用于 Debian 系统:Ubuntu 20.0.4 …

    2023-03-31
    149
  • Keras安装教程

    Keras安装教程Keras是一个用Python编写的高级神经网络API,它可以在TensorFlow、CNTK或Theano上运行。Keras的设计原则是使创建神经网络变得简单、快速,同时保持高度的模块化、可扩展性和可维护性。由于其易学易用的特点,Keras已经成为了人工智能入门的首选框架之一。

    2024-06-13
    57
  • 云顶之弈s7羁绊(云顶之弈s7福星阵容)

    云顶之弈s7羁绊(云顶之弈s7福星阵容)

    2023-09-27
    145
  • redis报错:read error on connection的两种原因分析[通俗易懂]

    redis报错:read error on connection的两种原因分析[通俗易懂]最近线上php模块偶现 read error on connection;具体报错日志如下 Uncaught exception 'RedisException' with me…

    2023-02-04
    152

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注