类指针压缩空间

一、类指针压缩介绍

压缩指针,指的是在 64 位的机器上,使用 32 位的指针来访问数据(堆中的对象或 Metaspace 中的元数据)的一种方式。

对象头中的 Class Pointer 默认占 8 个字节,开启 -XX:+UseCompressedOops 后,为了节省空间压缩为 4 个字节,Java 堆中对象指针会被压缩成 32 位,使用堆基地址(如果堆在低 26G 内存中的话,基地址为 0)。如果堆内存超过 32GB(JVM 是 8 字节对齐),那么压缩指针会失效,因为 32G 内存后,压缩就没有多大必要了,要管理那么大的内存指针也需要很大的宽度。在堆内存小于 32G 时,可以通过编码、解码方式进行优化,使得 JVM 可以支持更大内存配置。当堆内存空间大于 32G 时,压缩指针参数可能会失效,会强制使用 64 位(即 8 字节)来对 Java 对象寻址了。

#开启指针压缩:
-XX:+UseCompressedOops
#关闭指针压缩:
-XX:-UseCompressedOops

但是这个 32GB 是和字节对齐大小相关的,也就是 -XX:ObjectAlignmentInBytes 配置的大小(默认是 8 字节,Java 默认是 8 字节对齐)。-XX:ObjectAlignmentInBytes 可以设置为 8 的整数倍,最大 128,如果设为 24,那么配置最大的堆内存超过 96GB 压缩之指针会失效。

二、_mark 和 _klass 指针

JVM 中,每个对象都有一个指向它自身类的指针,不过这个指针只是指向具体的实现类,而不是接口或者抽象类。只有是 64 位平台上启用了类指针压缩才会存在这个区域。对于 64 位平台,为了压缩 JVM 对象中的 _klass 指针的大小,引入类指针压缩空间(Compressed Class Pointer Space)

_mark:mark word 一组标记,描述了对象的状态,包括对象默认哈希值(如果没有覆盖默认的 hashCode 方法,则哈希值在 hashCode 方法被调用之后,会被记录到 MarkWord 之中)、对象的形状(是否是数组)、锁状态(偏向锁等锁信息,偏向锁在 Java 15 中废弃:Disable and Deprecate Biased Locking)、数组长度(如果标记显示这个对象是数组,描述了数组的长度)。MarkWord 的实现仅仅包含一个 uintptr_t 类型,所以,在 32 位和 64 位虚拟机上面,大小分别是 4 字节和 8 字节。

_klass:是指向对象实现的 Class 的指针。JDK7 之前指向的区域位于持久带(Permanent Generation),JDK8 之后,永久代带废弃,引入了元数据区的概念(Metaspace),所以 JDK8 之后指向的是这个元数据区。这个指针可能是被压缩的,即压缩指针(Compressed OOPs)。当开启对象压缩时占用 4 字节(JVM默认开启),关闭时占用 8 字节

class oopDesc {private:volatile markWord _mark; // 对象头 mark wordunion _metadata {Klass*      _klass; // 类型指针:执行类的指针narrowKlass _compressed_klass;} _metadata;
}
class markWord {private:uintptr_t _value;
}
  1. 32 位的 JVM:​​​​​​​
    1. _mark:4 字节。mark word
    2.  _klass:4 字节。指向类的指针,对象的内存布局中的第二个字段(_klass,在 32 位 JVM 中,相对对象内存的位置的偏移量是 4,64 位的是 8)指向的是内存中对象的类定义
  2. 64 位的 JVM:​​​​​​​​​​​​​​
    1. _mark:8 字节
    2. _klass:8 字节
  3. 开启了指针压缩的 64 位的 JVM:
    1.  _mark:8 字节
    2. _klass:4 字节

三、类指针压缩空间

JDK1.8 移除了 permanent generation,class metadata 存储在 native memory (meta space)中,其大小默认是不受限的,可以通过 -XX:MaxMetaspaceSize 来限制。

在 JVM 使用 -XX:+UseCompressedClassPointers 和 -XX:+UseCompressedOops 开启 Compressed Class 的功能后,会在 Metaspace 中开辟出一块新的空间(Compressed Class Space),这个空间不足会出现了 OOM,可以通过设置 -XX:CompressedClassSpaceSize(默认值为1G) 的大小或者 -XX:-UseCompressedClassPointers 来关闭该功能。

如果开启了-XX:+UseCompressedOops 及 -XX:+UseCompressedClassesPointers(默认开启),则UseCompressedOops 会使用 32-bit 的 offset 来代表 java object 的引用,而 UseCompressedClassPointers 则使用32-bit 的 offset 来代表 64-bit 进程中的 class pointer。可以使用 CompressedClassSpaceSize 来设置这块的空间大小,CompressedClassSpace 分配在 MaxMetaspaceSize 里头,即 MaxMetaspaceSize = CompressedClassSpaceSize + Metaspace area (excluding the Compressed Class Space) Size,压缩指针后的内存布局:

指针压缩概要

  1. 64 位平台上默认打开
  2. 使用 -XX:+UseCompressedOops 压缩对象指针
    1. oops 指的是普通对象指针(ordinary object pointer)
    2. Java 堆中对象指针会被压缩成 32 位
    3. 使用堆基地址(如果堆内存低于 26G 时,基地址为 0),即指针的偏移量针对于堆的基地址
  3. 使用 -XX:+UseCompressedClassPointers 选项来压缩类指针
    1. 对象中指向类元数据的指针会被压缩成32位
    2. 使用类指针压缩空间的基地址

四、元空间和类指针压缩空间的区别

类指针压缩空间只包含类的元数据,比如 InstanceKlass, ArrayKlass 仅当打开了 UseCompressedClassPointers 选项才生效。为了提高性能,Java 中的虚方法表也存放到这里。元空间包含类的其它比较大的元数据,比如方法,字节码,常量池(类常量池、运行时常量池)等。

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

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

相关文章

跳表的学习记录

跳表(Skip List)是一种数据结构,它通过在多个层次上添加额外的前向指针来提高有序数据的搜索效率。跳表与其他常见的有序数据结构(如二叉搜索树、平衡树如AVL树和红黑树、B树等)相比,具有其独特的优缺点&am…

vue3中如何使用TypeScript?

在Vue 3中引入和使用TypeScript非常简单。下面是在Vue 3中引入和使用TypeScript的步骤: 创建Vue 3项目:首先,使用Vue CLI创建一个新的Vue 3项目。可以使用以下命令: vue create my-project在创建项目时,选择TypeScri…

国标GB28181安防监控平台EasyCVR周界入侵AI算法检测方案

在城市管理和公共安全领域,安全视频监控的重要性日益凸显。AI视频智能分析平台基于深度学习和计算机视觉技术,利用AI入侵算法,能够实时、精准地监测周界入侵行为。 TSINGSEE青犀在视频监控及AI视频智能分析领域拥有深厚的技术积累和丰富的实…

全面介绍SSO(单点登录)

全面介绍SSO(单点登录) SSO英文全称Single SignOn,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比…

亮相史上规模最大高交会,Coremail展现邮件技术创新实力

11月19日,第二十五届中国国际高新技术成果交易会在深圳落下帷幕,作为国内邮件行业引领者,Coremail受邀参展。 展览现场,Coremail邮件解决方案及系列产品受到了众多参观者与业内人士的关注与好评。Coremail XT6邮件系统技术成熟&a…

【JavaEE初阶】——Linux 基本使用和 web 程序部署(下)

文章目录 前言一、Linux 常用命令 1.1 ls 命令 1.2 pwd 命令 1.3 cd 命令 1.4 touch 命令 1.5 cat 命令 1.6 mkdir 命令 1.7 rm 命令 1.8 cp 命令 1.9 mv 命令 1.10 man 命令 1.11 less 命令 1.12 head 命令 1.13 tail 命…

玻色量子事件活动

2023年 2023.7 玻色量子携最新相干光量子计算机惊艳亮相2023数字经济大会 2023.6 打造“新型计算数据中心”!玻色量子与科华数据(002335.SZ)携手共创 2023.6 玻色量子“天工量子大脑”亮相中关村论坛,大放异彩 2023.5 100量…

基于mvc的大学生家教信息网站系统php+vue

运行环境:phpstudy/wamp/xammp等 开发语言:php 后端框架:Thinkphp5 前端框架:vue.js 服务器:apache 数据库:mysql 数据库工具:Navicat/phpmyadmin 开发软件:hbuilderx/vscode/Dreamweaver/PhpSt…

029 - STM32学习笔记 - ADC(三) 独立模式单通道DMA采集

029 - STM32学习笔记 - 单通道DMA采集(三) 单通道ADC采集在上节中学习完了,这节在上节的内容基础上,学习单通道DMA采集。程序代码以上节的为基础,需要删除NVIC配置函数、中段服务子程序、R_ADC_Mode_Config()函数中使能…

python绑定或无绑定类方法

1 python绑定或无绑定类方法 python函数是一种对象,在导入时会运行def语句,将函数对象赋值给函数名。 python方法是类内def定义的函数,即类方法。 1.1 访问类方法 python类方法可以通过类或实例进行访问。 NO访问方式描述1类.方法名(实例…

21.什么是bean的自动装配?

什么是bean的自动装配? 在Spring框架中,在配置文件中设定bean的依赖关系是一个很好的机制,Spring 容器能够自动装配相互合作的bean,这意味着容器不需要配置,能通过Bean工厂自动处理bean之间的协作。这意味着 Spring可以通过向Bean Factory中注入的方式自动搞定bean之间的…

50-75GHz大功率六倍频源设计

摘 要 本文介绍了毫米波的特点,根据构成毫米波倍频器的不同器件,介绍了不同毫米波倍频器的实现方法,综述了毫米波倍频器这一领域的研究水平及其发展动态,重点研究频段全波导带宽倍频器的设计方法,从而将波段信号扩展到…

华为鸿蒙开发(HarmonyOs开发):超详细的:DevEco Studio 的安装和配置 、华为第三方包依赖:SDK软件包的安装、Nodejs的导入配置

2023年11月28日20:00:00 ⚠️⚠️HarmonyOs 开发工具 ⚠️⚠️ ⚠️⚠️DevEco Studio 的安装和配置⚠️⚠️ 文章目录 一、打开鸿蒙开发工具官网二、下载 DevEco Studio三、配置 DevEco Studio四、错误处理 ⚠️⚠️⚠️❤️❤️ 关注了解更多 一、打开鸿蒙开发工具官网 下面…

人工智能原理复习--绪论

文章目录 人工智能原理概述图灵测试人工智能的研究方法符号主义连接主义行为主义总结 下一篇 人工智能原理概述 人工智能是计算机科学基础理论研究的重要组成部分 现代人工智能一般认为起源于美国1956你那夏季的达特茅斯会议,在这次会议上,John McCart…

利用python对数据进行季节性和趋势拆解

1. 引言 时间序列数据是按时间顺序排列的数据点的集合。与传统的交叉-sectional 数据不同,时间序列数据通常具有时间维度,因此每个数据点都与一个特定的时间点相关联。这种数据类型在许多领域中都很常见,如经济学、气象学、股票市场分析等。…

泛微E-Office SQL注入漏洞复现

0x01 产品简介 泛微E-Office是一款标准化的协同 OA 办公软件,泛微协同办公产品系列成员之一,实行通用化产品设计,充分贴合企业管理需求,本着简洁易用、高效智能的原则,为企业快速打造移动化、无纸化、数字化的办公平台。 0x02 漏…

【Python小游戏】推荐8款自由的Python游戏项目

推荐8款自由的Python游戏项目 今天给大家推荐8款不错的Python小游戏,这些小游戏所有项目文件(包括所需的所有代码、图像和音频文件),给大家已经放到平台的下载频道,需要的可以注意一下文末的链接地址。 下面给大家简单…

智能优化算法应用:基于蝙蝠算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于蝙蝠算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于蝙蝠算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蝙蝠算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

ELk部署,保姆级教学超详细!!!

Elk(Elasticsearch, Logstash, Kibana)是一套日志收集、存储和展示方案,是由Elastic公司开发的开源软件组合。 Elasticsearch:是一个分布式的搜索和分析引擎。它能够处理大量的数据,并提供快速、准确的搜索结果&#x…

63 权限提升-Linux脏牛内核漏洞SUID信息收集

目录 演示案例:Linux提权自动化脚本利用-4个脚本Linux提权SUID配合脚本演示-AliyunLinux提权本地配合内核漏洞演示-MozheLinux提权脏牛内核漏洞演示-Aliyun,Vulnhub涉及资源: linux提权相对windows提权方法相对少一些,linux提权方法相对来讲有七八种方式…