类加载

类的生命周期:

类加载_第1张图片 类的生命周期
  • 加载和链接,链接不是完全等加载完毕之后才执行,而是一个并行执行的过程;
  • 初始化的情况:
    • 遇到new、getstatic、putstatic、invokestatic这4条字节码指令时,如果类没有进行初始化,则需要先触发初始化;
    • 使用Java.lang.reflect包的方法对类进行反射调用的时候,如果没有进行过初始化,则需要先触发其初始化;
    • 当初初始化一个类的时候,如果其父类还没有初始化,需要先初始化父类;
    • 当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的类),虚拟机会先初始化这个主类。
  • 不被初始化的情况:
    • 通过子类引用父类的静态字段;
    • 通过数组定义来引用类;
    • 调用类的常量;

类加载过程: 

类加载_第2张图片 类加载过程

加载:

  •  通过一个类的全限定名来获取定义此类的二进制流

  • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构

  • 在内存中生成一个代表这个类的Class的对象,作为这个类的各种数据的访问入口

  验证:

  • 验证是连接的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机的自身安全
  • 文件格式验证
  • 元数据验证
  • 字节码验证
  • 符号引用验证

准备:

  • 准备阶段正式为类变量分配内存并设置变量的初始值。这些变量使用的内存都将在方法区中进行分配。

  • 这里的初始值并非我们指定的值,而是其默认值,但如果被final修饰的变量,在准备过程中,常量值会被一同设定。

解析: 

  •  解析阶段是虚拟机将常量池中的符号引用替换为直接引用的过程
  • 类或者接口的解析
  • 字段解析
  • 类方法解析
  • 接口方法解析

初始化: 

  •  类初始化阶段是类加载过程的最后一步,前面类加载的过程中除了在加载阶段用户应用程序可以通过自定义类加载器参与外,其余动作完全由虚拟机主导与控制。
  • 到了初始化阶段,才是真正执行类中定义的Java程序代码
  • 在准备阶段,变量已经赋过一次系统要求的初始值,而在初始化阶段,则根据开发者通过程序控制制定的主观计划去初始化类变量和其他资源
  • 初始化阶段是执行类构造器方法的过程。

你可能感兴趣的:(JVM)