类指针压缩空间

一、类指针压缩介绍

压缩指针,指的是在 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,一经查实,立即删除!

相关文章

国标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()函数中使能…

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

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

泛微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提权方法相对来讲有七八种方式…

stm32 TIM

一、TIM简介 TIM(Timer)定时器定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断。16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时定时器不仅具备基本的定时中断功能&…

FFmpeg介绍

官方网站:http://www.ffmpeg.org/ 项目组成 libavformat 封装模块,封装了Protocol层和Demuxer、Muxer层,使得协议和格式对于开发者来说是透明的。FFmpeg能否支持一种封装格式的视频的封装与解封装,完全取决于这个库&#xff0c…

QT中的 容器(container)-大全

一、介绍 Qt库提供了一套通用的基于模板的容器类&#xff0c;可以用这些类存储指定类型的项。比如&#xff0c;你需要一个大小可变的QString的数组&#xff0c;则使用QVector<QString>。 这些容器类比STL&#xff08;C标准模板库&#xff09;容器设计得更轻量、更安全并…

光伏电站开发流程

随着人们对可再生能源的关注度不断提高&#xff0c;光伏电站的开发流程也变得越来越重要。光伏电站是一种利用太阳能发电的设施&#xff0c;它可以有效地减少化石能源的消耗&#xff0c;同时也可以为环保事业做出贡献。 首先&#xff0c;要进行光伏电站的开发&#xff0c;需要选…

PWM 正玄波形 通过C语言生成

#include <stdio.h> #include <math.h> #include <stdint.h>#define SAMPLE_POINT_NUM (200) /* 需要生成的点的个数 */ #define SINE_MAX (255) /* sin 函数幅值 */ #define PI (3.14…

pytorch训练模型内存溢出

1、训练模型命令命令 如下所示是训练命名实体识别的命令&#xff0c;在win10系统下执行 activate pytorch cd F:\Python\github\ultralytics-main\submain\pytorch_bert_bilstm_crf_ner-main f: python main.py --bert_dir"../model_hub/chinese-bert-wwm-ext/" --…

TIME_WAIT状态TCP连接导致套接字无法重用实验

理论相关知识可以看一下《TIME_WAIT相关知识》。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<arpa/inet.h> #include<sys/socket.h> #include<errno.h> #include<syslog.h> #inc…