JAVA中new Object对象占用多少字节,Java对象的组成是哪些?Java对象头的组成又是哪些,MarkWord是什么,有什么作用?

Java对象头的组成_java对象头结构-CSDN博客

JAVA中new Object对象占用多少字节,Java对象的组成是哪些?Java对象头的组成又是哪些,MarkWord是什么,有什么作用?

一、JAVA对象的结构组成

JAVA Object对象的结构组成:

java对象由三部分组成: 对象 = 对象头+实例数据+对齐填充

对象头也有三部分组成:对象头=Mark word + MeaData + 数组长度 

MarkWord: 记录着线程同步锁状态、线程id、标识、hashcode、GC状态等等。

MeaData: 元数据指针,指向元空间

数组长度:(类包含了数据对象,才有数组长度)

在Java中,一个对象占用的内存空间并不是固定不变的,它取决于多个因素,包括对象本身的数据成员(包括从父类继承的)、对象引用的类型(比如是32位还是64位JVM)、JVM的实现以及可能的JVM调优参数等。因此,要精确计算一个对象占用的内存空间是比较复杂的。

不过,我们可以从一些基本概念出发,来大致估算一个对象所占用的内存:

  1. 对象头(Object Header):每个Java对象都有一个对象头,它包含了对象的一些元数据,如哈希码(HashCode)、GC分代年龄(Generational GC Age)、锁状态标志(Lock Status)、线程持有的锁(Thread holding monitors on object)、偏向线程ID(Biased Locking)、偏向时间戳(Biased Locking epoch)等。这个对象头的大小在32位和64位JVM上有所不同。在32位JVM上,普通对象的对象头通常占用8字节(Mark Word)+ 4字节(Class Metadata Address),但在开启压缩指针的64位JVM中,对象头可以压缩到12字节或更少。

  2. 实例数据(Instance Data):对象本身的数据成员所占用的空间。这取决于对象声明的属性,包括基本数据类型(如int, double等)和引用类型(如String, 其他对象引用等)。基本数据类型的大小是固定的,而引用类型的大小则取决于JVM是32位还是64位(在32位JVM中通常是4字节,在64位JVM中通常是8字节,但可以通过JVM参数来启用压缩指针以减小这个大小)。

  3. 对齐填充(Padding):JVM会自动在对象数据之后添加一些填充字节,以确保对象的大小是某个字节的倍数(通常是8字节),这样可以提高内存访问的效率。

由于上述因素的复杂性,通常我们不会手动去计算一个对象的确切内存大小。但是,我们可以使用一些工具来帮助我们估计,比如:

  • Java Instrumentation API:通过编写一个agent来监控JVM中对象的内存使用情况。
  • JVM参数:通过设置JVM参数(如-XX:+PrintGCDetails-XX:+HeapDumpOnOutOfMemoryError等)来获取更详细的GC日志或堆转储,进而分析对象的内存占用。
  • 专业工具:使用如VisualVM、Eclipse Memory Analyzer Tool (MAT)、JProfiler等专业的Java性能分析和内存分析工具来查看对象的内存占用情况。

二、JAVA对象头的结构组成

Mark Word是Java虚拟机(JVM)中对象头(Object Header)的一个重要组成部分,它用于存储对象的元数据和运行时信息。具体来说,Mark Word包含了关于对象的一系列重要标记位和信息,如对象的哈希码(HashCode)、锁状态、GC分代信息等。这些信息对于JVM的垃圾回收(GC)机制、线程同步以及对象的快速比较和定位等操作至关重要。

Mark Word的主要特点:

  1. 大小:在64位JVM中,Mark Word通常占用8字节的内存空间。虽然这个大小在不同的JVM实现和版本中可能有所不同,但8字节是一个常见的配置。

  2. 内容可变:Mark Word的具体内容可以根据对象的类型和状态而变化。例如,一个未被锁定的对象和一个正在被线程持有的锁对象,其Mark Word中的锁状态信息就会不同。

  3. 重要性:Mark Word是JVM进行垃圾回收和线程同步的基础。它帮助JVM识别哪些对象是可以被回收的,以及哪些对象正在被线程使用并需要保持其状态的一致性。

Mark Word包含的信息:

  • 哈希码(HashCode):用于实现对象的快速比较和定位。
  • 锁状态:用于支持对象的同步和线程安全。根据JVM的实现和版本,锁状态可以包括无锁、偏向锁、轻量级锁和重量级锁等不同的级别。
  • GC分代信息:用于标记对象的年龄和存活状态,以便进行垃圾回收。这有助于JVM优化垃圾回收过程,提高内存使用效率。

Mark Word的作用:

  1. 垃圾回收:通过Mark Word中的GC分代信息,JVM可以识别哪些对象是可以被回收的,从而执行垃圾回收操作,释放内存空间。
  2. 线程同步:Mark Word中的锁状态信息支持了Java的线程同步机制。通过锁状态的变化,JVM可以控制多个线程对共享资源的访问,确保线程安全。
  3. 性能优化:Mark Word的设计还考虑到了性能优化的需求。例如,通过减少对象头的大小或使用压缩指针等技术,可以减少对象的内存占用,提高内存使用效率。

综上所述,Mark Word是Java虚拟机中一个非常重要的数据结构,它存储了对象的元数据和运行时信息,支持了JVM的垃圾回收和线程同步机制,并有助于优化内存使用和提高性能。

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

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

相关文章

FreeRTOS的任务创建和删除

1、任务创建和删除的API函数 任务的创建和删除本质就是调用FreeRTOS的API函数。 和任务创建和删除有关的函数主要有三: xTaskCreate():动态方式创建任务。 xTaskCreateStatic():静态方式创建任务。 vTaskDelete():删除任务。 那又有思考了 2、动态方式创建任…

实验五之用Processing绘画

1.案例代码如下: import generativedesign.*; import processing.pdf.*; import java.util.Calendar; Tablet tablet; boolean recordPDF false; float x 0, y 0; float stepSize 5.0; PFont font; String letters "Sie hren nicht die folgenden Gesnge…

超级字符串技能:提升你的编码游戏

嘿嘿,uu们,今天咱们来详解字符函数与字符串函数,好啦,废话不多讲,开干! 1.:字符分类函数 C语言中又一系列的函数是专门做字符分类的,也就是一个字符属于什么类型的字符的,这些函数的使用需要包含头文件ctype.h 这些函数的使用方法都十分类似,博主在这里就举两到三个…

【C语言篇】C语言常考及易错题整理DAY3

文章目录 选择题整形提升与算术转换左移右移操作符操作符优先级与结合性后置指针变量基本知识 编程题最大连续1的个数完全数计算单词倒排面试题.珠玑妙算两数之和 选择题 整形提升与算术转换 声明以下变量,则表达式: ch/i (f*d – i) 的结果类型为( &…

<Qt> 系统 - 网络编程 | 音视频

目录 前言: 一、QUdpSocket (一)核心 API 概览 (二)设计一个UDP回显服务器 二、QTCPSocket (一)核心 API 概览 (二)设计一个TCP回显服务器 三、HTTP Client 四、…

msgqueue.hpp队列模块

目录 一.MsgQueue模块介绍 二.MsgQueue类的实现 成员变量 构造函数与析构函数 成员函数 参数设置函数 setArgs 参数获取函数 getArgs 三.MsgQueueMapper类的实现 成员变量 构造函数 成员函数 创建表格函数 createTable 删除表格函数 dropTable 插入数据函数 inse…

GPT-4o:开启多模态AI识别新纪元

GPT-4o功能简介 在人工智能的演变历程中,图像识别技术始终占据着核心地位。技术的发展日新月异,使得AI不仅能够识别图像内容,还能将其转化为文字描述。特别值得一提的是,OpenAI在春季发布的GPT-4o模型,将图像识别技术…

微软Detours Hook库编译与使用

Detours 是微软开发的一个强大的Windows API钩子库,用于监视和拦截函数调用。它广泛应用于微软产品团队和众多独立软件开发中,旨在无需修改原始代码的情况下实现函数拦截和修改。Detours 在调试、监控、日志记录和性能分析等方面表现出色,已成…

shell命令行解释器—既陌生有熟悉的东西

今天做一个感性的认识来,用一个生活的例子。 你生活在有一条村子里面,在村的东边就是王婆,王婆呢?她主要做什么呢啊?她在村儿里面呢,也不种地啊,那她干什么呢?他主要做帮别人进行婚嫁…

【TabBar嵌套Navigation案例-发现页面-按钮上的图片旋转 Objective-C语言】

一、接下来,我们来做这个,点击以后,让它出一个蓝色的View 1.就是我们示例程序的这种效果, 一点击,让这个按钮旋转,然后呢,再让它出来一个蓝色的View, 首先,我们要去监听它的点击事件,这是第一,我点击以后,我要做一些什么样的操作,要有点击事件, 所以呢,我要把…

JS基础进阶Webs-API、HTML 、DOM

一、JS中的API 1. 定义 JavaScript API是指为JavaScript提供的一组编程接口和对象,用以允许开发者访问和操作Web浏览器或其他JavaScript环境(如Node.js)提供的特定功能。这些API使得开发者能够编写更加动态和交互式的Web应用程序。 2. 主要…

服务器数据恢复—raid5阵列热备盘未全部启用导致阵列崩溃的数据恢复案例

服务器存储数据恢复环境: 一台EMC某型号存储中有一组RAID5磁盘阵列。该raid5阵列中有12块硬盘,其中2块硬盘为热备盘。 服务器存储故障: 该存储raid5阵列中有两块硬盘离线,只有1块热备盘启用替换掉其中一块离线盘,另外…

​产品经理-​你如何理解“互联网思维(35)

在产品规划和功能改版中,确实非常重视用户需求和体验。产品需求是互联网产品的核心 用户体验是互联网产品的重点。在互联网新产品规划中,会非常重视用户验证环节 确保做出来的东西确实是用户想要的;而在已经上线的产品中,往往会有…

人工智能与机器学习原理精解【12】

文章目录 分级聚类理论分级聚类的详细说明1. 定义2. 算法3. 计算4. 例子5. 例题 皮尔逊相关系数 julia实现 参考文献 分级聚类 理论 分级聚类的详细说明 1. 定义 分级聚类(Hierarchical Clustering),又称为层次聚类,是一种通过…

谷歌反垄断官司败诉后,或又面临被拆分风险?

KlipC报道:上周8月5日,美国法院裁定谷歌的搜索业务违反了美国反垄断法,非法垄断在线搜索和搜索文本广告市场。据悉,胜诉的美国司法部正在考虑拆分谷歌。其他选项包括强制谷歌与竞争对手分享更多数据,以及防止其在人工智…

【二叉树进阶】--- 根据二叉树创建字符串

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 数据结构 从本篇文章开始,博主将分享一些结合二叉树的进阶算法题。 🏠 根据二叉树创建字符串 📌 题目内容 根据二叉…

从行为面试问题(behavioral questions)看中美程序员差异。

中美程序员在职场中的工作状态和职能、福利等有很大区别,从面试中的BQ轮就可见一斑。 中美程序员的面试轮差异? 国内的面试轮在不同公司间差异很大,但总体的问题类型包含笔试面试(算法题、概念题、项目深挖、职业目标、职场文化…

FGUI+TS如何实现数字翻滚

FGUITS如何实现数字翻滚 实现效果如下: 实现步骤: fgui制作组件和特效 fgui制作组件,设置一条竖向数字包含1-9或者小数点符号等,可见区域为一个数字大小,最好可见区域紧贴数字,这样滚动的时候滚动区域范围…

深度学习------------------卷积神经网络(LeNet)

目录 LeNet网络手写的数字识别MNIST总结卷积神经网络(LeNet) 问题 LeNet网络 手写的数字识别 MNIST ①输入的是:3232的image ②放到一个55的卷积层里面(为什么是5?因为32-x128,∴x5)&#xff0c…

【教程】Ubuntu给pycharm添加侧边栏快捷方式

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 以下教程不仅限于pycharm,其他软件也是一样操作 1、进入到pycharm的目录,先通过命令行打开pycharm: ./bin/pycharm…