一个空的Object在内存中占用几个字节

news2024/11/17 1:30:47

文章目录

  • 一、对象在内存中的布局
    • 1. 对象头
      • 1.1. 哈希码(Hash Code):
      • 1.2. 对象所属的年代(Generation):
      • 1.3. 对象锁(Object Lock):
      • 1.4. 锁状态标志(Lock State Flags):
      • 1.5. 偏向锁(Biased Lock):
      • 1.6. 偏向时间(Biased Time):
      • 1.7. 数组长度(Array Length):
    • 2. 实例数据
    • 3. 对齐填充
  • 二、对象头不同部分占用字节大小
    • 1. Mark Word
    • 2. Klass Pointer
    • 3. Array Length
  • 三、JOL工具验证
    • 1. 添加依赖
    • 2. 测试验证
  • 四、正确解答

一、对象在内存中的布局

1. 对象头

1.1. 哈希码(Hash Code):

用于快速查找对象的哈希码。哈希码通常在对象创建时计算,并且可以用于在哈希表等数据结构中快速定位对象。

1.2. 对象所属的年代(Generation):

在分代垃圾回收算法中,对象会被分为不同的年代,用于优化垃圾回收的效率。对象头中可能包含一个标识对象所属年代的字段。

1.3. 对象锁(Object Lock):

用于实现对象级别的同步。对象锁可以被线程获取和释放,以保证对对象的操作的互斥性。

1.4. 锁状态标志(Lock State Flags):

用于记录对象锁的状态,如无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态等。锁状态标志可以用于优化锁的获取和释放的过程。

1.5. 偏向锁(Biased Lock):

用于提高无竞争情况下的锁性能。偏向锁是一种特殊的锁状态,当一个线程获取了对象的锁时,可以将锁标记为偏向锁,以后该线程再次获取锁时可以直接获取,无需进行额外的同步操作。

1.6. 偏向时间(Biased Time):

记录了对象上次偏向锁的时间。当其他线程尝试获取对象的锁时,会比较当前时间与偏向时间,如果时间差超过一定阈值,偏向锁会自动升级为轻量级锁。

1.7. 数组长度(Array Length):

对于数组对象,对象头中可能包含一个字段记录数组的长度。

2. 实例数据

  1. 实例数据是对象中存储的具体属性数据信息。
  2. 每个对象在创建时会根据其所属的类的定义来分配存储空间,用于存储类的属性数据。
  3. 实例数据包括了对象所属类的所有属性信息,包括父类的属性信息。在面向对象编程中,类定义了对象的属性和方法,而对象是类的实例化表示,因此每个对象都会有自己的一份实例数据来存储属性值。
  4. 总而言之,实例数据是对象中用于存储类的属性数据信息的部分,包括父类的属性信息。它是对象的核心组成部分,用于记录对象的状态和特征。

3. 对齐填充

  1. 在Java中,对象的大小需要按照8个字节或者8个字节的倍数进行对齐,这是为了避免伪共享问题。

  2. 伪共享是指多个线程同时访问不同的变量,但这些变量被缓存在同一个缓存行中,导致频繁的缓存行失效和刷新,降低了程序的性能。

  3. 为了避免伪共享问题,Java虚拟机会对对象进行对齐和填充。对齐是指按照一定的字节对齐方式,将对象的起始地址对齐到8个字节或者8个字节的倍数。填充是指在对象的末尾添加额外的字节,使得对象的大小满足对齐的要求。

  4. 通过对齐和填充,可以确保对象的起始地址和大小都满足对齐要求,从而避免伪共享问题。对于大多数的Java对象来说,它们的大小通常都是8个字节或者8个字节的倍数,因此可以有效地避免伪共享带来的性能损失。

  5. 需要注意的是,对齐和填充是由Java虚拟机自动进行的,开发者无需手动干预。在编写Java程序时,只需要关注对象的设计和使用,而无需过多关注对象的对齐和填充问题。

二、对象头不同部分占用字节大小

1. Mark Word

  1. 在32位的Java虚拟机中,Mark Word通常是32位,
  2. 在64位的Java虚拟机中,Mark Word通常是64位,

2. Klass Pointer

  1. 在32位的Java虚拟机中,Klass Pointer通常是4字节,用于指向类的元数据信息。
  2. 在64位的Java虚拟机中,Klass Pointer的大小可以根据虚拟机启用指针压缩(Compressed Oops)的方式和最大堆内存的大小来确定。
  3. 如果指针压缩被启用,或者最大堆内存小于32GB,那么Klass Pointer仍然是4字节。但是,如果指针压缩未启用并且最大堆内存大于等于32GB,那么Klass Pointer将会是8字节,以便能够支持更大的堆内存。

3. Array Length

  1. 当我们创建一个空的Object数组时,它不包含任何元素。
  2. 因此,该数组的长度为0,即没有任何元素被存储在数组中。

三、JOL工具验证

1. 添加依赖

<dependency>
    <groupId>org.openjdk.jol</groupId>
    <artifactId>jol-core</artifactId>
    <version>0.10</version>
</dependency>

2. 测试验证

@Test
public void test() {
    Object obj = new Object();
    //查看对象内部信息
    System.out.println(ClassLayout.parseInstance(obj).toPrintable());
}

在未开启压缩指针的情况下:-XX:-UseCompressedOops

yasuo

运行结果:

64
在(jdk1.6开始)默认开启压缩指针的情况下:
yasuo

四、正确解答

  1. 一个空的对象,在开启压缩指针的情况下,占16个字节。
  2. 其中 Markword 占8个字节、类元指针占4个字节, 对齐填充占4个字节。

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

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

相关文章

POE级联蓝牙定位系统方案_蓝牙信标,蓝牙网关,级联蓝牙网关

近年来,随着新能源行业的快速发展,在化工厂,核电厂以及电力电厂等企业,对人员定位,人员导航,资产定位,生命体征监测的需求越来越大。传统的蓝牙室内定位方案中蓝牙信标为锂亚电池供电,需定期更换电池且有安全隐患,为更好的服务有蓝牙定位导航,被动人员定位,生命体征…

vue创建项目报错npm install --loglevel error --legacy-peer-deps

vue创建项目报错npm install --loglevel error --legacy-peer-deps 如图所示&#xff1a; 话不多说&#xff0c;直接上解决方法&#xff1a; 1、找到这两个文件&#xff08;每个人的位置不一样&#xff0c;像我是安装在D盘&#xff09; 2、分别点进去&#xff0c;右键—属性…

A Survey on Evaluation of Large Language Models

这是LLM相关的系列文章&#xff0c;针对《A Survey on Evaluation of Large Language Models》的翻译。 大型语言模型评价综述 摘要1 引言2 背景2.1 大语言模型2.2 AI模型评估 3 评估什么3.1 自然语言处理任务3.1.1 自然语言理解3.1.2 推理3.1.3 自然语言生成3.1.4 多语言任务…

vue——接口修改请求头——有些接口不需要请求头传递token——基础积累

最近在写后台管理系统的时候&#xff0c;遇到一个切换租户的功能。在请求接口的时候不需要传递token 直接上代码吧&#xff1a; 1.html代码 login2(this.user.id, this.ruleForm.tenantType) .then(this.afterLogin) .finally(() > {this.confirmLoading false;if (this…

ja3指纹和akamai指纹

问题&#xff1a; 请求失效&#xff0c;带上抓包软件却可以->检测ja3浏览器指纹 方法&#xff0c;python 安装curl_cffi库 pip install curl_cffi 查看浏览器指纹 https://tls.browserleaks.com/json python 原生request 缺少两个指纹 使用curl_cffi之后 可以看到结果…

多模态系列论文--BLIP 详细解析

论文地址&#xff1a;BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 论文代码&#xff1a;https://github.com/salesforce/BLIP BLIP 1 研究动机及本文贡献2 相关工作2.1 ALBEF模型2.2 VLMO模型 3 本文贡献1--U…

LLaMA: Open and Efficient Foundation Language Models

背景 用最少的计算资源&#xff0c;解决了LLM大模型预测问题&#xff0c;训练了一些列的LLaMa模型&#xff0c;在参数量比较少的情况下&#xff0c;达到业界大模型效果。 主要贡献就是提升了LLM模型的训练速度和效率&#xff0c;在小容量的基础上&#xff0c;大大提升了模型的…

C语言 - AES软件加解密算法

概述 &#xff08;AES&#xff09;RIJNDAEL算法是一个数据块长度盒密钥长度都可变的分组加密算法&#xff0c;其数据块长度和密钥长度都可独立地选定为大于等于128位且小于等于256位的32位任意倍数。深入学习请参考《密码学》书籍&#xff0c;谢谢各位参阅。 验证环境&#xf…

Git基本操作:版本打Tag的作用以及基本操作流程

作用介绍 在git代码管理时&#xff0c;有时候我们想对某个特定的commit 添加标记&#xff0c;比如要标识版本信息&#xff0c;这时候就可以用的git中的打标签功能。 打tag就类似于我们看书放书签一样&#xff0c;以后可以直接用tag找到提交的位置&#xff0c;不然的话&#x…

devtools热部署的使用

引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency>idea开启热部署 改动后 ctrl …

解决:yarn 无法加载文件 “C:\Users\admin\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本“ 的问题

1、问题描述&#xff1a; 其一、报错的整体代码为&#xff1a; yarn : 无法加载文件 C:\Users\admin\AppData\Roaming\npm\yarn.ps1&#xff0c;因为在此系统上禁止运行脚本 // 整体的报错代码为 &#xff1a; yarn : 无法加载文件 C:\Users\admin\AppData\Roaming\npm\yar…

Django_测试模块(六)

目录 开始写我们的第一个测试 首先得有个 Bug 创建一个测试来暴露这个 bug 运行测试 修复这个 bug 更全面的测试 测试视图 针对视图的测试 Django 测试工具之 Client 改善视图代码 测试新视图 测试 DetailView 集中管理用例文件 使用Django测试运行器 源码等资料…

国风美少女【InsCode Stable Diffusion 美图活动一期】

一、 Stable Diffusion 模型在线使用地址&#xff1a; https://inscode.csdn.net/inscode/Stable-Diffusion 二、模型相关版本和参数配置&#xff1a; Steps&#xff08;采样迭代步数&#xff09;: 20 Sampler&#xff08;采样方法&#xff09;: Euler a 采样迭代步数(Steps)Sa…

Spring Boot 中的 @Field 注解详解

Spring Boot 中的 Field 注解详解 引言 Spring Boot 是目前 Java 生态圈中最受欢迎的 Web 应用开发框架之一&#xff0c;它提供了很多优秀的功能和工具&#xff0c;可以帮助开发者快速构建高效、可靠的 Web 应用程序。其中一个重要的功能就是数据绑定和验证&#xff0c;Sprin…

CRM系统中AI如何进行销售线索评分?有什么好处(下)

好的CRM解决方案既要充分利用销售人员的经验和技能&#xff0c;又要尽可能地消除人为错误。其底层逻辑是&#xff0c;从过程中消除不可预测的人为因素&#xff0c;同时利用好人的自然技能。基于此&#xff0c;AI人工智能被引入CRM客户管理系统&#xff0c;可以说CRM销售线索评分…

如何使用 Docker 部署 FreeGPT-WebUI:一个简单的教程

目录 1. FreeGPT-WebUI 项目简介 2. 安装 Docker 3. 从 Docker Hub 拉取 FreeGPT-WebUI 镜像 4. 使用 Docker 运行 FreeGPT-WebUI 应用程序 5. 访问 FreeGPT-WebUI 应用程序 总结 在本教程中&#xff0c;我们将了解如何使用 Docker 部署 FreeGPT-WebUI&#xff0c;一个基…

看完这一篇,就不要再说不了解Dockerfile了

首先&#xff0c;让我们来介绍一下对于大多数人来说容易有疑惑的地方 WORKDIR 指定工作目录 什么是工作目录&#xff1f;为什么要指定&#xff1f; 拿 window 系统的 powershell 控制台来类比。打开 powershell 命令行控制台&#xff0c;显示的是默认目录&#xff0c;如&…

Java基本概述

1、Java语言的特点 特点一&#xff1a;面向对象 两个基本概念&#xff1a;类、对象三大特性&#xff1a;封装、继承、多态 特点二&#xff1a;健壮性 去掉了C/C中影响程序健壮性的部分&#xff08;指针、内存的申请与释放等&#xff09;&#xff0c;有一个相对安全的内存管…

3-测试用例(CASE)

目录 1.什么是测试用例&#xff1f; 2.为什么要有测试用例&#xff1f; 3.练习 1.什么是测试用例&#xff1f; 测试用例&#xff08;Test Case&#xff09;是为了实施测试而向被测试的系统提供的一组集合。 这组集合包含&#xff1a;测试环境、操作步骤、测试数据、预期结…

办公技巧:43个Excel函数,进阶必备,值得收藏

目录 一、关联匹配类 二、清洗处理类 三、逻辑运算类 四、计算统计类 五、时间序列类 今天给大家分享43个Excel函数&#xff0c;希望对大家能有所帮助&#xff01; 一、关联匹配类 经常性的&#xff0c;需要的数据不在同一个Excel表或同一个Excel表不同sheet中&#xff0c…