面试题:Java 对象的创建过程

Java 对象的创建过程

1.1 类加载

虚拟机遇到new指令,首先检查这个指令的参数能否在元空间的常量池中定位到一个类的符号引用,并且看这个符号引用的类是否已经被加载,解析和初始化。如果没有,那么在双亲委派模式下,查找对应的class文件。

1.2 分配内存

对象所需内存大小根据加载的类来确定,为对象分配内存也就是在堆内存中分配一块确定大小的内存。

  • 如果内存规整,指针碰撞
  • 如果内存不规整,虚拟机需要维护一个列表,则使用空闲列表

1.3处理并发安全问题

在分配内存空间时,另外一个问题时及时保证new对象的线程安全性,创建对象时非常频繁的操作,虚拟机需要解决并发问题。

  • CAS:失败重试,区域加锁,保证指针更新操作的原子性。
  • TLAB:把内存分配的动作按照线程划分在不同的空间中进行。

1.4 初始化分配到的空间

内存分配结束,虚拟机将分配到的内存空间都初始化为零值。这一步保证了对象的实例字段在java代码中可以不用赋初始值就可以直接使用,程序能访问到这些字段的数据类型对应的零值。

1.5 设置对象头

对象头包含两部分信息。第一部分是用于存储对象自身的运行时数据,如hashcode、GC分代年龄、锁状态标志、线程持有的锁等;第二部分是类型指针,指向它对应的类元数据,VM用这个确定其属于哪个类的实例。

1.6 执行init方法

在java程序的视角看来,初始化才正式开始,初始化成员变量,执行实例化代码块,调用类的构造方法,并把堆内对象的首地址赋值给引用变量。

原文地址:https://www.cnblogs.com/dalianpai/p/14147596.html