1. 布局简介
在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)(保证8个字节的倍数)。
而对象头又分为以下三种
- 对象标记Mark Word
- 类元信息(存储的是指向该对象类元数据的首地址)(又称类型指针)
- 长度(这个只有数组有)
面试题
Object object=newObject()谈谈你对这句话的理解?
- new出的对象位置所在:先在JVM里的堆->新生区->伊甸园区
- 构成布局为对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)
2.对象头
2.1 对象标记MarkWord
public class ObjectHeaderDemo {
public static void main(String[] args) {
Object o = new Object();
//哈希码存在对象的哪里
System.out.println(o.hashCode());
//GC标记和GC次数又放在哪里
System.gc();
}
}
一般而言JDK8按照默认情况下,new一个对象占多少内存空间?
- 如果只是new一个对象,对象中没有任何数据的话,那么需要占16个字节的空间
- 因为Mark Word占了8个字节,类型指针占了8个字节,一共是16个字节
在64位虚拟机下,MarkWord是64bit大小的,其存储结构如下所示
由图可见,MarkWord默认存储对象的HashCode、分代年龄和锁标志位等信息。
这些信息都是与对象自身定义无关的数据,所以MarkWord被设计成一个非固定的数据结构以便在极小的空间内存存储尽量多的数据。它会根据对象的状态复用自己的存储空间,也就是说在运行期间MarkWord里存储的数据会随着锁标志位的变化而变化。
2.2 类型指针
所谓的类元信息(类型指针)其实就可以说是模板
在main方法中新建一个Customer的实例,这个实例会被新建在堆空间
而其对象头的类型指针指向的是方法区的模板,也就是Customer的klass的类元信息
3. 实例数据和对齐填充
实例数据是指属性数据信息,包括父类的属性信息
而对齐填充是指虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐这部分内存按8字节补充对齐。
比如说只有一个对象头的实例对象,16字节+4字节+1字节=21字节,因为21不是8的倍数,所以需要对其填充,填充3字节,使其是8的倍数
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/94976.html