jvm在创建对象时,首先判断该对象所对应的类是否已经被加载、链接和初始化,如果没有则先执行类的加载过程。类的加载过程见 java类加载。
类加载检查通过后,虚拟机在堆中为新生对象分配内存。
内存分配完成后,虚拟机将分配到的内存空间(不包括对象头)都初始化为零值,这一步操作保证了对象的实例字段在java代码中可以不赋值就使用。
对象的内存布局
对象在内存中的存储布局可以分为三块区域:对象头、实例数据和对齐填充。
对象头包含两部分信息。第一部分用于存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志等。第二部分是类型指针,通过该指针可以确定该对象是哪个类的实例。
实例数据是对象真正存储的有效信息,包括从父类中继承与该类定义的变量。在父类中定义的变量会出现在前面。
对象的初始化
虚拟机为对象分配好内存并初始化为零值(这一步是程序无法控制的),紧接着会执行对象的初始化,这个初始化有程序的初始化块与构造器完成。
关于初始化执行的顺序见 java初始化块执行顺序