- 判断对象是否已经加载、链接、初始化:是否在常量池中定位到该类的符号引用,并检查是否被加载、解析、初始化,
- 为对象分配内存:首先计算对象占用空间大小,然后在堆中划分一块内存给新对象
- 处理并发安全问题:创建对象是一个比较频繁的过程,需要解决并发问题。
- CAS失败重试、区域加锁;保证指针更新具有原子性
- (TLAB ,Thread Local Allocation Buffer) :把内存分配的动作按照线程划分在不同的空间中进行
- 初始化分配到的空间:比如int=0,boolean=0
- 设置对象的对象头:将对象的所属类(即类的元数据信息)、对象的HashCode和对象的GC信息、锁信息等数据存储在对象的对象头中
- 执行init方法进行初始化(赋初值)
对象的内存布局
内部结构:对象头、实例数据、对齐填充(8的倍数)
实例数据对象真正存储的有效信息,包括程序代码中定义的各种类型的字段(包括从父类继承下来的和本身拥有的字段) 规则:
- 相同宽度的字段总被分配在一起
- 父类中定义的变量会出现在子类之前
- 如果CompactFields参数为true(默认为true),子类的窄变量可能插入到父类变量的空隙