大致流程:
new一个对象:根据new指令参数去方法区运行时常量池定位这个类的符号引用,然后看这个符号引用代表的类是否被加载、解析、初始化,如果没有则执行类加载过程。
待类加载完成之后,每个对象所需的内存大小就是完全确定的。所以从Java堆中可划分一块确定大小的内存,并将分配到的内存都初始化为零值(不包括对象头),所以说在堆上的变量都有默认值的,然后再设置该实例对象的对象头(todo,对象头的详细介绍)。
执行<init>方法就可以执行构造方法,静态方法为类变量这些东西进行赋值,这样一个类就丰满了起来。
对象的内存布局:对象头,实例数据,内存对齐。
对象头:视虚拟机而定,32位虚拟机则是32位,64位虚拟机则是64位。
实例数据:各种类型的字段内容。
内存对齐:hotspot要求对象的大小必须为8的整数倍。因为实例数据不一定是8的整数倍,所以内存对齐就是让对象大小是8的整数倍。
被static、final修饰的常量会在编译时存入被调用类的常量池中。
<cinit>方法:执行static这些方法