© 2020 GitHub, Inc.

对象的创建流程

in Note with 0 comments

对象的创建

对象的创建方式:

对象的创建流程

对象的创建流程

类加载检查

检查new指令的参数是否在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否被加载、解析和初始化过

内存分配

对象的内存大小在类加载时便已确定。

分配方式分为两种:

内存时分配需要考虑的问题

对象的创建非常频繁,修改指针指向的位置,并发情况下不是线程安全的。可能会出现正在给对象A分配内存,指针还没有修改,对象B又同时使用了原来的指针来分配内存的情况。

解决方案:

  1. 分配内存空间的动作进行同步处理—虚拟机采用了CAS配上失败重试的机制保证了更新操作的原子性。
  2. 内存分配的动作按照线程划分的空间中进行,即每个线程预先在堆中分配一小块内存(本地线程缓冲TLAB),只有在分配新的缓存区的时候需要同步锁定。可使用-XX:+/-UseTLAB启用TLAB。

初始化内存空间

内存分配完成之后,虚拟机会将内存空间初始化为0(除对象头),如果使用了TLAB,该动作可以提前到分配TLAB时进行。这步操作保证了对象的实例字段在Java代码中步赋初值就直接使用。

设置对象信息

虚拟机将设置对象时哪个类的实例、如何寻找到类的元数据信息、对象的哈希码(真正调用hashcode()时才会计算)、对象的GC分代年龄等。还会根据虚拟机的运行状态,决定是否启用偏向锁等。

构造函数初始化

执行Class文件的<init>()方法,按照程序员意愿初始化对象。

回复