1 对象的创建过程
当执行字节码new指令时,首先会判断目标类是否已经进行过类加载,没有则会先执行一次类加载。执行完毕后,jvm会为新生对象分配内存,并将分配到的内存空间都初始化为零值(eg. int为0,boolean为false)。
然后设置对象头的相关信息,例如对象的元数据即class信息、对象的GC分代年龄、锁标识等。
最后执行Class的<init>()方法,也就是构造方法。
至此,对象完全创建完成。
2 对象的内存布局
对象在内存中的布局可分为三个部分:对象头、实例数据、对齐填充。
2.1 对象头
对象头分为两部分:Mark Word 和 类型指针 以及数组对象特有的信息:数组长度。
Mark Word:对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID等,这部分数据的长度在32位和64位虚拟机中分别为32bit和64bit,官方称之为“Mark Word”。
类型指针:即指向对象类型元数据的指针,也就是class对象;jvm可以通过它来确对象是哪个类的实例。
2.2 实例数据
实例数据存储的是对象真正的有效信息,也就是我们在代码中定义的成员属性,无论是从父类继承的,还是在子类定义的,都会在这里记录。
2.3 对齐填充
这块数据并不是必然存在的,也没有特别的含义,它仅仅是占位符的作用。由于HotSpot虚拟机的自动内存管理系统要求对象其实地址必须是8字节的整数倍,也就是说任何对象的大小都必须说8字节的整数倍。如果对象的实例数据部分没有对齐的话,就需要通过“对齐填充”部分来补全。