JVM学习笔记-03

50 阅读2分钟

类的加载过程

  • 装载

    所谓装载,就是将Java类的字节码文件加载到机器内存中,并在内存中构建出Java类的原型(类模板对象)

    在这个阶段,Java虚拟机必须完成以下3个事情:

    1. 通过类的全限定名,获取类的二进制数据流
    2. 解析类的二进制数据流为方法区内的数据结构
    3. 创建java.lang.Class类的实例(堆中),作为方法区这个类的各种数据的访问入口

    PS:数组类本身不是由类加载器负责创建,而是由JVM在运行时根据需要而直接创建的,但是数组的元素类型仍然需要依靠类加载器去创建。

  • 链接

    • 验证

      它的目的保证加载的字节码是合法,合理且符合JVM规范的。包含格式检查、语义检查、字节码检查、引用符号检查。

    • 准备

      为类的静态变量分配内存,并将其初始化为默认值。在这个阶段,虚拟机就会为这个类分配相应的内存空间,并设置默认初始值。Java虚拟机为各类型变量赋默认的初始值如下表所示:

      类型默认初始值
      byte(byte)0
      short(short)0
      int0
      long0L
      float0.0f
      double0.0
      char\u0000
      booleanfalse
      referencenull

      注意:Java并不支持boolean类型,对于boolean类型,内部实现是int,由于int的默认值是0,所以boolean的默认值是false;这里不包含基本数据类型的字段用static final修饰的情况,因为final在编译的时候就分配了,准备阶段会显式赋值;

    • 解析

      将类、接口和方法的符号引用(字面量描述)转为直接引用(内存地址)。在HotSpot JVM中加载、验证、准备和初始化会按照顺序有条不紊地执行,但链接阶段的解析操作往往会在执行完初始化之后再执行。

  • 初始化

    为类的静态变量赋予正确的初始值。执行初始化方法(<clint>()方法)该方法由类静态成员的赋值语句和静态代码块合并而来。一个类在使用之前必须进行初始化,这里的使用指的是主动使用。

  • 使用

  • 卸载

    Class对象和ClassLoader对象都要卸载,所以一般与JVM关闭时一同卸载。

类的加载器

Bootstrap ClassLoader(引导类加载器), Extension ClassLoader(扩展类加载器), Application ClassLoader(应用类加载器)

类加载机制:双亲委派机制。