java 对象结构_java对象的结构
在Hotspot JVM中,32位机器下,Integer对象的大小是int的几倍?
我们都知道在Java语言规范已经规定了int的大小是4个字节,那么Integer对象的大小是多少呢?
要知道一个对象的大小,那么必须需要知道对象在虚拟机中的结构是怎样的,来看看Hotspot中对象在内存中的结构:
从上面的这张图里面可以看出,对象在内存中的结构主要包含以下几个部分:
Mark Word: 对象的Mark Word部分占4个字节,其内容是一系列的标记位,比如轻量级锁的标记位,偏向锁标记位等等。
Class对象指针:Class对象指针的大小也是4个字节,其指向的位置是对象对应的Class对象(其对应的元数据对象)的内存地址
对象实际数据: 这里面包括了对象的所有成员变量,其大小由各个成员变量的大小决定,
比如:byte和boolean是1个字节,short和char是2个字节,int和float是4个字节,long和double是8个字节,reference是4个字节
对齐: 最后一部分是对齐填充的字节,按8个字节填充。
根据上面的图,那么我们可以得出Integer的对象的结构如下:
Integer只有一个int类型的成员变量value,所以其对象实际数据部分的大小是4个字节,
然后再在后面填充4个字节达到8字节的对齐,所以可以得出Integer对象的大小是16个字节。
因此,我们可以得出Integer对象的大小是原生的int类型的4倍。
关于对象的内存结构,需要注意数组的内存结构和普通对象的内存结构稍微不同,
因为数据有一个长度length字段,所以在对象头后面还多了一个int类型的length字段,占4个字节,接下来才是数组中的数据,如下图:
1,HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:
对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。
2,HotSpot虚拟机的对象头(Object Header)包括两部分信息,
2,1,第一部分用于存储对象自身的运行时数据,
如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,
这部分数据的长度在32位和64位的虚拟机(暂 不考虑开启压缩指针的场景)中分别为32个和64个Bits,官方称它为“Mark Word”。
对象需要存储的运行时数据很多,其实已经超出了32、64位Bitmap结构所能记录的限度,
但是对象头信息是与对象自身定义的数据无关的额 外存储成本,
考虑到虚拟机的空间效率,Mark Word被设计成一个非固定的数据结构以便在极小的空间内存储尽量多的信息,它会根据对象的状态复用自己的存储空间。
例如在32位的HotSpot虚拟机 中对象未被锁定的状态下,
Mark Word的32个Bits空间中的25Bits用于存储对象哈希码(HashCode),4Bits用于存储对象分代年龄,2Bits用于存储锁标志 位,1Bit固定为0,
在其他状态(轻量级锁定、重量级锁定、GC标记、可偏向)下对象的存储内容如下表所示。
2,2,对象头的另外一部分是类型指针,
即是对象指向它的类的元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
并不是所有的虚拟机实现都必须在对象数据上保留类型指针,换句话说查找对象的元数据信息并不一定要经过对象本身。
另外,如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据,
因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是从数组的元数据中无法确定数组的大小。
java 对象结构_java对象的结构相关推荐
- java对象的内存结构_Java对象在内存中的结构分析
问题:在Hotspot JVM中,32位机器下,Integer对象的大小是int的几倍? HotSpot虚拟机中,对象在内存中的布局分为三块区域:对象头.实例数据和对齐填充,其中对象头又分为:Mark ...
- java初始化实例化_Java对象的创建过程:类的初始化与实例化
一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...
- java 循环嵌套_Java的循环结构及嵌套循环
Java的循环结构及嵌套循环 Java的循环结构while 循环结构do...while 循环结构for 循环结构 Java的嵌套循环概念循环控制语句breakcontinuereturn forea ...
- java 对象复活_Java对象复活
java 对象复活 总览 收集覆盖了finalize()的对象之后,将其添加到终结处理队列中,以在调用每个对象的finalize()方法之后进行清理. 如果您复活了物体,会发生什么? 何时定案? fi ...
- java jol原理_Java对象布局(JOL)实现过程解析
java对象布局JOL(java object layout),描述对象在堆内存的布局.如下图: 1.markword 固定长度8byte,描述对象的identityhashcode,分代年龄,锁信息 ...
- java开源对象池_JAVA 对象池
GenericObjectPool利用一个org.apache.commons.collections.CursorableLinkedList对象来保存对象池里的对象.这种对象池的特色是: 可以设定 ...
- java浅度克隆_java对象 深度克隆(不实现Cloneable接口)和浅度克隆
为什么需要克隆: 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说 ...
- java中对象类型转换_Java 对象类型的转换
对象类型的转换在Java编程中经常遇到,主要分为向上转型和向下转型,但一定要记住,无论是向上转型还是向下转型,两个类之间必须有继承关系.先来看看基本概念. 向上转型又被称作自动类型转换,就是子类引用的 ...
- java list对象排序_Java 对象集合List排序的5种方式
目标明确 排序对象类 public class Student{ private String name; private Integer age; public Student(String nam ...
最新文章
- linux内核中的数据结构
- 100个短缺职业排行榜出炉 找工作,这些职业最缺人
- STM32 CAN 过滤器、滤波屏蔽器配置总结
- 南京晓庄学院java实验五_讲座|城市文化与南京世界“文学之都”的建设
- oracle导入步骤,Oracle导入dmp文件步骤
- FreeBSD重新加载rc.conf
- aix 添加lv 大小
- 元素周期表排列的规律_元素周期表的秘密【机密文件】
- 软件概要设计_软件测试模型之 V模型
- Java JDBC中的Statement和PreparedStatement
- ARMv8的OP-TEE源代码的获取和编译
- SEO之搜索引擎简史
- 3V升压5V芯片,3V升压5V的电路图
- 老男孩python最新_老男孩Python高级运维自动化实战 老男孩Python高级运维开发10期 全套Python视频教程...
- 贪心+二分+快速排序
- molten php 上传,molten:PHP 应用透明链路追踪工具
- SAP管理软件系统框架合同业务的实现及相关注意事项解析
- 基于Java的学生兼职平台设计与实现
- Android的在线考试app
- 有关监控的前5名最佳书籍
热门文章
- 用 Python 识别图片中的文字
- 原版英文书籍《Linux命令行》阅读记录5 | 使用命令
- 简单程序所需要的简单 asp.net通用数据库访问类
- 每天进步一点点《ML - 人工神经网络》
- python连接redis哨兵_python连接redis sentinel集群
- 窗口缩小 怎么让定位的盒子不动_一次解决你的图像尺寸和定位问题
- win7双系统,暴力删除ubuntu后出现grub rescue解决
- 利用坐标变换证明惯性主轴方向是惯性矩的极值方向
- 交换两幅图像的幅度谱和相位谱,并重构图像
- RobHess的SIFT源码分析:imgfeatures.h和imgfeatures.c文件