第一步 new指令
是否能在常量池里定位到这个类的符号引用,并检查是否被加载,解析,初始化。如果没有必须先加载
第二步 分配内存
不同的垃圾收集器使用不同方式分配内存
- 指针碰撞:对于规整的Java堆内存,对于带有Compact过程的收集器
- 空闲链表:基于Mark-Swap算法的收集器,类似CMS
分配方式
- 采用CAS算法
- 采用TLAB 预先给线程分配一块堆空间,那么只有分配的时候需要同步锁定,提升性能
第三步 虚拟机初始化对象
- 这一步将分配到的内存初始化为零值(不包括对象头),如果使用TLAB,这一工作也可以提前至TLAB分配时进行。
- 设置对象头的类型指针、对象hash码、GC分代年龄、是否偏向锁等
第四步 程序员赋值
也就是执行代码中的构造方法<init>
网友评论