对象的内存布局:(HotSpot)
对象头:分为两块,分别是“Mark Word”与类型指针。
Mark Word:存储自身运行时数据,比如说哈希码,线程持有的锁啊,锁状态啊,GC年龄分代这些数据。
类型指针:指向它类元数据的指针,虚拟机通过这个指针可以知道这是哪个类的实例啊。(不是所有的虚拟机上都有)
实例数据:对象真正的存储的有效信息,也是程序代码中所定义的各种字段的内容。
对齐填充(不一定需要存在):占位符。在HotSpot VM当中对象大小必须是8字节的整数倍,不是就利用占位符填充
对象的创建:
在Java语言层面,对象的创建通常只需要new一下就好。但是在虚拟机层面,对象的创建旺旺需要几步操作:
1.虚拟机遇到一条new指令的时候,回去检查这个指令的参数是否能在常量池当中定位到一个类符号的引用,之后检查这个符号代表的类是否被加载、解析和初始化,如果没有,那必须先执行相应的类的加载过程。
2.加载检验后为对象在堆中分配内存。
3.初始化分配的内存,将内存空间大小地初始化为零值。
4.对对象进行一些必要的设置 Mark Word
5.执行<init>方法将对象按照意愿进行初始化