使用new关键字创建普通对象(非Array、Class等对象?)的过程
查找类信息
根据new指令的参数去确认对应的类信息是否已经被加载、解析、初始化过,如果上述过程完成,则进行下一步;如果没有,则需要首先对类进行加载、解析、初始化。分配内存
当类被加载完成后,类对应对象的内存大小就可以确定了,普通对象的内存可以分为三部分,对象头、实例数据、填充数据。
a.对象头
对象头包括两部分,自身运行所需数据(如hashcode\gc年龄等)、指向类元数据的指针
b.实例数据
实例数据是对象的真实有用的数据即对象的字段数据,其字段布局顺序由HotSpot的默认策略(long/double,int,char/short,boolean/byte,reference point)和字段的定义顺序决定;
子类会继承父类的字段,并且创建子类对象时也会为继承来的字段分配内存,遵循上述的字段布局策略的前提下,同长度的情况父类的字段在子类字段之前
c.填充数据
填充数据仅为了字节对齐赋零值
对象内存分配完成后,会除对象头外的内存片段初始化为对应的零值。