类是如何加载和实例化的(执行角度)
加载分为五个部分,分别是:加载(生成class对象作为方法区的入口和确定类加载器)、验证(确保class文件的字节流信息是否符合虚拟机的要求)、准备(分配内存)、解析(将常量池的符号引用替换为直接引用的过程)和初始化(真正开始执行)
- 确认类元信息是否存在。在new的时候,JVM会先查看metaspace(元空间)中是否存在。如果不存在,再双亲委派模式下使用当前类加载器以ClassLoader+包名+类名为Key进行查找对应的.class未见。如果没有找到该文件,则抛出ClassNotFoundException;如果找到,则对该类进行加载,并生成对应的Class类对象。
- 分配对象内存。首先计算对象占用内存大小,然后进行同步操作,比如采用CAS保证分配操作的原子性。
- 设定默认值。成员变量值都需要设定默认值。
- 设置对象头。设置新对象的HASH值,GC信息,类元信息等。
- 执行init方法