今天就跟大家聊聊有关如何分析Java对象的组成,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
在java中对象对于我们来说再熟悉不过了,运用也简单,什么时候想要new一个,所以说啊咱们程序员不缺对象!
那我们真的了解对象吗?它由哪几部分组成呢?
在HotSpot虚拟机中,也就是我们的常用虚拟机。对象组成分为3个区域:对象头、实例数据、对齐填充。
对象头分为两个部分:对象自身运行时的数据,类型指针
对象自身运行时的数据,例如:HashCode、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳、GC分代年龄等。这部分数据长度在32位和64位虚拟机(若未开启压缩指针)下分别为32bit和64bit。这部分称为"Mark Word"。
并且Mark Word 被设计为没有固定的数据结构用来在很小的空间内可以存储更多的信息,它会根据不同的状态存储不同的数据。例如在32位情况下,存储内容的变化如下
类型指针,也就是指向此对象的类元数据的指针,也就是通过这个指针来知道这个对象是哪个类的实例,但是不是所有的虚拟机实现都是通过这个来查找类的元数据的。
像HotSpot虚拟机,我们都知道平时new了一个对象保存的是这个对象的引用,这个引用存储的是对象实例的地址,而有些虚拟机的实现是这个引用存储的是一个对象的句柄地址,句柄地址又包含了对象实例地址和对象类型地址。
也就是这类虚拟机有一个句柄池,句柄池内部存储了对象的实例数据地址和类数据地址,所以这类虚拟机可以直接通过句柄池中类数据地址去找到这个对象是属于哪个类的实例。
如果对象是个数组,那还需要一块地方来记录数据的长度。
实例数据就是对象真正存储的数据区,各种类型的字段内容。
这部分内容没什么别的意义,就是起着占位符的作用,主要是因为HotSpot虚拟机的内存管理要求对象的大小必须是8字节的整数倍,而对象头正好是8个字节的整数倍,但是实例数据不一定,所以需要对齐填充补全。
看完上述内容,你们对如何分析Java对象的组成有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。