-
通过符号引用定位到类是否被加载。没有就加载类。执行类加载与验证的过程
-
分配内存:类的准备阶段。类加载完成后就能确定对象分配多少内存。如果虚拟机具有
Compact
压缩功能(标记整理),就是用指针碰撞
(记录头尾位置);如果只有标记清理
的虚拟机,就是用空闲列表
。 -
分配内存的方式:
CAS
与TLAB
两种。如果多线程并发创建,需要考虑同步问题(多个对象指向一个地方)。
-
CAS:一般使用
CAS
和失败重试保证原子性。 -
TLAB
:按照线程分配不同空间(本地线程分配缓冲),只有TLAB
用完,需要分配新的才需要同步。是否使用该方式通过参数指定
-
解析,符号引用替代成直接引用
-
初始化
-
分配到的内存初始化为零(除了对象头)。这就是对象属性不需要初始化可以直接使用
-
设置对象头:什么类的对象,元数据,哈希码,对象GC分代年龄等信息。根据虚拟机运行状态,判断是否启用偏向锁
-
执行初始化方法:<init>。按照程序员指定的初始化过程初始化对象。这里就是执行初始化的过程
- 父类的静态初始化块
- 本类的静态初始化块
- 父类的初始化块
- 父类的构造方法
- 本类初始化块
- 本类的构造方法
来源:oschina
链接:https://my.oschina.net/u/3870422/blog/3220397