你真的了解java对象吗(对象内存布局)

对象头
Mark Word:占32bit或64bit(看jvm是多少位的),以32位为例,通常气孔下存储对象的hashcode、gc分代年龄、锁标志位、是否应用偏向锁。当该对象被作为同步锁时,该32位可悲复用存储其他信息:偏向锁-》偏向id偏向时间戳;轻量级锁-》指向线程的Displace Mark Word的指针;重量级锁-》仔细那个重量级锁的指针
Class Matedata Address:类型指针指向方法区中该对象所属类的元数据信息,占4个或8个字节
ArrayLength:如果是数组对象才会有这部分内存,记录了数组的长度
实例数据
应用程序实实在在要访问的数据,通常由以下变量组成
byte,char,short,int,float占四个字节(这是在jvm存储的数据结构,和语言层面有本质的不同)
long,double 占八个字节
reference 占四个或八个字节
内部类 以上类型的组合
对齐填充
这部分数据没有实质性的作用,仅用来占位。
Hotspot的内存管理系统是一8个字节位单位的,非数组对象的对象头刚好是8字节或16字节,因此当实例数据不是8字节倍数时需要用这个来填充

猜你喜欢

转载自blog.csdn.net/weixin_37311400/article/details/87203044