调用 Java.exe 时, 需要把类给加载到 JVM 中,使用类加载器进行加载
编译到加载整体流程
类加载过程
在硬盘上查找并通过 IO 读入字节码文件, 加载到 JVM 内存的方法区当中
?> 方法区中存放的哪些信息
- 方法区中的内容: 类被加载到方法区中后主要包含, 运行时常量池、类型信息、字段信息、方法信息、类加载器的引用、对应 class 实例的引用等信息
- 类加载器的引用: 类加载器属于是一个实例对象, 存放在堆中, 在方法区中指向类加载器的地址
- class 实例的引用: 类加载器在加载类信息放到方法区中后,这些字节码信息加在一起, 有共同的特征和行为, 会创建一个对应的 Class 类型的实例对象存放到堆中
验证
- 校验字节码文件的正确性
- 编译的字节码, 有可能被修改, 在加载之前要验证字节码的正确性
准备
- 给类的静态变量分配内存,并赋予默认值
- 静态变量是在类加载的时候就被执行的
解析
- 将符号引用替换为直接引用,该阶段会把一些静态方法替换为指向数据所存内存的指针或句柄等(直接引用),这个过程也称为是静态链接
- 静态链接过程(类加载期间完成)
- 动态链接是在程序运行期间完成的将符号引用替换为直接引用
初始化
- 对类的静态变量初始化为指定的值,执行静态代码块