java虚拟机加载类的过程

142 阅读1分钟

class文件加载到内存中的过程分为:

加载、链接、初始化

加载:

查找字节流,并以此创建类的过程。

启动类加载器:

需要通过启动类加载器(boot class loader)启动类加载器有C++实现,没有对应的java对象,Java中用null指代。

其他类加载器:

其他的类加载器都是 java.lang.ClassLoader 的子类,因此有对应的 Java 对象。这些类加载器需要先由另一个类加载器,比如说启动类加载器,加载至 Java 虚拟机中,方能执行类加载。 另外两个重要的类加载器是扩展类加载器(extension class loader)和应用类加载器(application class loader)

双亲委派模型,类加载器加载时先去请求父类加载器,在父类加载器没有加载类的情况下,类加载器才会尝试去加载

链接:

将创建的类合并至虚拟机,使之可被执行 分为,验证、准备、解析 三个阶段 验证阶段,确保加载类满足虚拟机约束条件 准备阶段,为被加载类的静态字段分配内存

初始化:

常量值(ConstantValue):

直接赋值,且被final修饰的类型由虚拟机完成

< clinit > 方法:

除了常量值之外的赋值操作,以及所有静态代码块中的代码,则会被 Java 编译器置于同一方法中,并把它命名为 < clinit >。 类加载的最后一步是初始化,便是为标记为常量值的字段赋值,以及执行 < clinit > 方法的过程。Java 虚拟机会通过加锁来确保类的 < clinit > 方法仅被执行一次。