类指针压缩空间

一、类指针压缩介绍

压缩指针,指的是在 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.hqwc.cn/news/227653.html

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

相关文章

文本生成超逼真歌曲,谷歌推出音乐模型Lyria

转换示例 谷歌旗下的DeepMind与视频平台YT合作,发布了目前最先进的音乐模型——Lyria。 为了突破传统音乐模型的生硬机器感,谷歌汇集了多个部门并与Charlie Puth、T-Pain、Troye Sivan等9位知名音乐人共同研发了Lyria。 Lyria可生成爵士、重金属、摇滚…

每日一题:LeetCode-202.面试题 08.06. 汉诺塔问题

每日一题系列(day 07) 前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 &#x1f50e…

在centos7上源码安装nginx

1. 安装必要的编译工具和依赖项 在编译Nginx之前,你需要安装一些编译工具和依赖项。可以通过以下命令安装: yum install gcc-c pcre-devel zlib-devel make 2. 下载Nginx源代码 从Nginx官网下载最新的源代码。你可以使用wget命令来下载: …

正则表达式及文本三剑客grep,awk,sed

目录 正则表达式 前瞻 代表字符 表示次数 位置锚定 分组或其他 grep 选项 范例 awk 前瞻 awk常见的内置变量 范例 sed 前瞻 sed格式 范例 搜索替代 格式 范例 分组后项引用 格式 范例 正则表达式 前瞻 通配符:匹配的是文件名 正则表达式&a…

【读论文】【泛读】S-NERF: NEURAL RADIANCE FIELDS FOR STREET VIEWS

文章目录 0. Abstract1. Introduction2. Related work3. Methods-NERF FOR STREET VIEWS3.1 CAMERA POSE PROCESSING3.2 REPRESENTATION OF STREET SCENES3.3 DEPTH SUPERVISION3.4 Loss function 4. EXPERIMENTS5. ConclusionReference 0. Abstract Problem introduction&…

REST-Assured--JAVA REST服务自动化测试的Swiss Army Knife

什么是REST-Assured REST Assured是一套基于 Java 语言实现的开源 REST API 测试框架 Testing and validation of REST services in Java is harder than in dynamic languages such as Ruby and Groovy. REST Assured brings the simplicity of using these languages into t…

【深入解析git和gdb:版本控制与调试利器的终极指南】

【本节目标】 1. 掌握简单gdb使用于调试 2. 学习 git 命令行的简单操作, 能够将代码上传到 Github 上 1.Linux调试器-gdb使用 1.1.背景 程序的发布方式有两种,debug模式和release模式release模式不可被调试,debug模式可被调试Linux gcc/g出来的二进制…

kali linux nmap 端口扫描 简单教程

本次实验所用工具如下: VMwarekali linux (namp扫描工具)Windows sever 2016 需开启(FTP,smp,Telnet,rdp)端口namp操作所用部分代码: -sP ping 扫描 -P 指定端口范围 -sV 服务版本探测 -A …

易宝OA系统ExecuteSqlForSingle接口SQL注入漏洞复现 [附POC]

文章目录 易宝OA系统ExecuteSqlForSingle接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 易宝OA系统ExecuteSqlForSingle接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章…

GitLab 登录中,LDAP和 Standard 验证有什么区别

在 GitLab 中,LDAP(Lightweight Directory Access Protocol)和 Standard 验证是两种不同的身份验证方法,它们有以下区别: LDAP(Lightweight Directory Access Protocol)身份验证: L…

WIFI HaLow技术引领智能互联,打破通信限制

在过去十年里,WIFI技术已在家庭和企业中建立起了庞大的网络,连接了数十亿智能互联设备,促进了信息的迅速传递。然而,当前的WIFI标准存在一些挑战,包括协议范围的限制和整体功能的受限,导致在较远距离进行通…

【开源】基于JAVA的城市桥梁道路管理系统

项目编号: S 025 ,文末获取源码。 \color{red}{项目编号:S025,文末获取源码。} 项目编号:S025,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询城市桥…