对象是怎么被创建的

第一步 new指令

是否能在常量池里定位到这个类的符号引用,并检查是否被加载,解析,初始化。如果没有必须先加载

第二步 分配内存

不同的垃圾收集器使用不同方式分配内存

  • 指针碰撞:对于规整的Java堆内存,对于带有Compact过程的收集器
  • 空闲链表:基于Mark-Swap算法的收集器,类似CMS

分配方式

  • 采用CAS算法
  • 采用TLAB 预先给线程分配一块堆空间,那么只有分配的时候需要同步锁定,提升性能

第三步 虚拟机初始化对象

  • 这一步将分配到的内存初始化为零值(不包括对象头),如果使用TLAB,这一工作也可以提前至TLAB分配时进行。
  • 设置对象头的类型指针、对象hash码、GC分代年龄、是否偏向锁等

第四步 程序员赋值

也就是执行代码中的构造方法

你可能感兴趣的:(对象是怎么被创建的)