java对象创建步骤
-
图示
-
虚拟机遇到⼀条new指令时,⾸先检查这个对应的类能否在常量池中定位到⼀个类的符号引⽤
-
判断这个类是否已被加载、解析和初始化
-
为这个新⽣对象在Java堆中分配内存空间,其中Java堆分配内存空间的⽅式主要有以下两种
指针碰撞
分配内存空间包括开辟⼀块内存和移动指针两个步骤
⾮原⼦步骤可能出现并发问题,Java虚拟机采⽤CAS配上失败重试的⽅式保证更新操作的原⼦性
空闲列表
分配内存空间包括开辟⼀块内存和修改空闲列表两个步骤
⾮原⼦步骤可能出现并发问题,Java虚拟机采⽤CAS配上失败重试的⽅式保证更新操作的原⼦性
-
指针碰撞:在堆中有2部分,空闲内存和使用内存
-
将指针往左移动,移动后产生的新内存给对象使用,这就是指针碰撞
-
空闲列表
有1张表,用于存储堆内存的空闲情况
空闲列表维护的是堆内存中不规则不连续的空闲区域
当某块内存被用后,就会从空闲列表中移除
- 将分配到的内存空间都初始化为零值
例如某个属性为int,则默认值为0
当属性为String时,则默认值为null
- 设置对象头相关数据
GC分代年龄
对象的哈希码 hashCode
元数据信息
-
执⾏对象init⽅法,也就是static方法
-
案例
在1个实体类中,先执行static方法,再执行无参构造方法,最后执行其他方法(例如set方法)