Java - JVM Class Loading

Java类加载机制

编译加载流程

类的生命周期

五步:

java-classloading-process

加载

简单来说,就是把Java文件“读”进JVM中。

类加载器

Parent First 模型

双亲委托模型:优先由父加载器尝试加载,不行的话再一级一级往下

java-classloading-parent-first

为什么采用Parent First代理模式?为了保证Java核心库都是由Java自己的加载器Bootstrap classloader加载完成的。 因为判断两个类是否相同,有两个因素:1是类文件的内容,2是由什么加载器加载。

Parent Last 模型

验证

加载完了Class文件,需要验证,主要有两个方面:一是内容规范检验,二是安全性检验(是否会危害虚拟机自身的安全)。

验证字节码文件是否合格:

准备

正式为类变量(被static修饰的变量)分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。

public static int value=123;

经过准备阶段,value = 0,经过初始化阶段后,value = 123。

public final static int value=123;

经过准备阶段,value = 123

解析

解析阶段是JVM将常量池(Constant Pool)内的符号引用替换为直接引用的过程。

解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用进行。

初始化

对Class Variables进行初始化赋值。

Fork me on GitHub